24su ver.
Note: this is for the Summer 2024 iteration of CSE 391. Looking for a different quarter? Please visit https://courses.cs.washington.edu/courses/cse391/.
git (2 points)Due Tuesday 07/23 at 10:00 am. No late submissions accepted.
Submission: Gradescope
Specification: Spec
This assignment continues HW4’s focus on learning how to use git as a version control system. In contrast to HW4, HW5 is completely focused on working with others; you’ll work on a website together with the entire class! In the process, you’ll practice working with a remote repository, using merge requests, and potentially resolving merge conflicts.
Warning
This assignment assumes that you’ve set up git and CSE GitLab from HW4. If you haven’t done that yet, please do that first!
Task 1: Collaborate on a shared GitLab repo¶
Everybody in CSE 391 has recently been hired by FAANG (hooray)! The frontend team wants to build a page that features all the incredible staff at the company. They’ve decided to distribute this task — i.e., each employee will add themselves to the staff page. This includes you!
Problem 1: View and clone the repository¶
You should have been given access to the following repository: cse391/24su/faang. If you cannot view this repository due to a permissions problem, please double-check your email for an invitation to the repository or contact course staff.
Your first step will be to clone the repository to your working computer (e.g. attu, vergil, or the CSE VM):
$ git clone git@gitlab.cs.washington.edu:cse391/24su/faang.git
You should now be able to cd into the faang folder and see a handful of files; most important to you are Product.java and Staff.java. You should also be able to compile all of the java files and “build” the site via:
$ javac *.java && java GenerateSite
Problem 2: Create a new branch for your additions to the staff page¶
Since so many people are working on this project, we won’t directly push to main; instead, we’ll create our own feature branch to make our own changes.
Create a new branch from the main branch. We suggest the name <GITLAB_USERNAME>_staff_page, where <GITLAB_USERNAME> is your GitLab username (e.g. mxw).
What if I need to make another branch?
Branch names need to be unique. Our autograder doesn’t grade you on the name of the branch, so feel free to use another name for following merge requests.
Problem 3: Add your bio to the staff page¶
In the repository, the Staff.java file stores all of the employees at FAANG as methods that return an Employee object (representing you).
Open the Staff.java file in your favourite text editor, while on your feature branch. Create a method — which must be named after your GitLab username — that returns one such Employee object.
Where is my username?
You can find this by going to GitLab, and clicking on the profile icon in the top right, your username is the text following the @ sign. It will usually be your CSE or UW NetID.
What goes into an Employee? Each employee has a:
StringnameStringjob title (position)Stringbio (description)Stringpicture file path (picture) and accompanyingStringalt text (altText)
For the name, position, and description, feel free to pick arbitrary (PG-13) Strings.
For the picture, pick something that you feel best represents you (does not have to be a photo of you). After you find a good photo, you should:
- place a copy of the image in the
images/staffdirectory - make the
pictureparameter ofEmployeethe name of the file (not including theimages/staffprefix, but including the extension) - add alt text that accurately describes the content of the image; if you’re curious about what makes “good alt text”, Deque’s How to Design Great Alt Text is a great intro, while the MDN docs on the
altproperty give a more technical overview.
Then, make sure that the entire program still compiles after your edits. If it doesn’t compile, you won’t be able to merge your changes!
This would be a good time to add and commit your changes.
Problem 4: Add your product to the products page¶
A similar page Products.java lists all the products FAANG sells. Open it in your favourite text editor (and still on your feature branch) and add a Product. This product must be named after your GitLab username. Similar to an Employee, a Product has:
StringnameStringdescriptionStringpicture file path (picture) and accompanyingStringalt text (altText)doubleprice of the product
Similar to the previous task, feel free to pick arbitrary Strings for the name and description, pick a valid image (this time, inside of images/products), and add some descriptive alt text. Note that the last parameter, the price, is a double, not a String.
Then, make sure that the entire program still compiles after your edits. If it doesn’t compile, you won’t be able to merge your changes!
This would be a good time to add and commit your changes.
Problem 5: Push your change to remote¶
Now, use the appropriate commands to push your branch to the remote repository.
You should be able to see your commits in GitLab using the following link (replacing GITLAB_USERNAME with your GitLab username):
https://gitlab.cs.washington.edu/cse391/24su/faang/tree/GITLAB_USERNAME_staff_page
Alternatively, you can double-check by:
- navigating to the repository main page
- click on the “Branches” page under “Code”, on the sidebar
- scroll through all of the branches of the repository to find yours
Problem 6: Create a merge request¶
When working on teams, you’ll typically have another teammate review your code before merging your changes into main. GitLab’s mechanism to do this is called a “merge request”, which lets teammates to review, comment on, and approve your work.
Create a merge request for your feature branch on GitLab. To do so,
- go to the repository main page
- select “Merge Requests” on the left side-nav, and click “New Merge Request”
- select your own branch in the “Select source branch” dropdown, and set your target branch to
main - click “Compare branches and continue”
- give your merge request a reasonable title, and write a description of your changes
- while often we want to delete the branch, be sure that you UNCHECK the box to delete the branch — we need the branch to still exist to give you credit in Gradescope
- leave the other dropdowns and options as-is, and submit your merge request!
Once this happens, GitLab will automatically run some code to make sure that:
- your branch can be merged properly (with no merge conflicts)
- your branch is “up-to-date” with the
mainbranch. if things have been merged intomainsince you made your branch, this will likely be false!- to fix this, merge the
mainbranch back into your own feature branch. You can do this locally or via the GitLab UI.
- to fix this, merge the
- your merge request doesn’t “break” the site. For this project, that means:
- all the
.javafiles compile and run with no errors - you haven’t removed any lines of the codebase in your merge request (this is to prevent you from accidentally deleting other people’s entries)
- you haven’t edited any files outside of
Staff.javaandProduct.java(this is to prevent you from accidentally breaking the HTML generation)
- all the
Caution
If one of the above is true, stop and fix those problems before you move on to the next step. You will not be able to merge without fixing them!
Problem 7: Comment on your merge request¶
Typically, you’ll request a review from your teammate(s). Right now, they’re a bit too busy with their own changes, so your own “review” will suffice. Leave at least one comment on a change in your merge request. It can say whatever you’d like!
Problem 8: Approve and merge your merge request¶
Let’s incorporate your changes into main so it can make it on the main website!
There is a “Merge” button close to the top of your page. If you’re able to click it, go for it - you’re done this step!
However, the merge button may be disabled. This is for one of four reasons:
- there is a merge conflict with
main - your branch is not up-to-date with the
mainbranch on GitLab - your code does not compile and run with no errors
- your merge request removes one or more lines from the existing codebase, or edits files that are not
Staff.javaorProduct.java
It is your responsibility to resolve these problems!
- You can resolve merge conflicts using the GitLab merge conflict UI (“Resolve conflicts”) or with the command-line. - make sure to not accidentally delete other people’s changes!!
- You can merge the
mainbranch on GitLab back into your feature branch - You can debug your program if it does not compile / runs incorrectly (this is usually a typo)
- You can add extra commits that restore the lines you’ve accidentally removed, or undo changes to other files
Problem 9: Turn In¶
To submit your work, you will submit the homework5.sh file to Gradescope.
You can get the homework5.sh file by running this command in your terminal:
wget https://courses.cs.washington.edu/courses/cse391/24su/homework/hw5/homework5.sh
This file containts just one function called print_username. Unlike the other homeworks, you will leave the echo command but replace the text string with your GitLab username.
function print_username {
echo "your gitlab username here"
}
Caution
Do not remove the echo from this command!! But only for this command!
To calculate your final score on this assignment, sum the individual scores from Gradescope.
- if your
scoreis between[0, 1), you will get0points - if your
scoreis between[1.0, 1.5), you will get1point - if your
scoreis between[1.5, 2], you will get2points
However, this score is provisional: if we notice that you’ve submitted someone else’s username, we reserve the right to change your score.
This autograder is still new (and we’ve recently added even more infrastructure). Running into problems? Post on Ed!
Tips¶
- Make a mistake? DO NOT try to go back and modify previous commits - this gets you in a huge mess when working on a shared project (like this)!
- the autograder is designed in a way where you can keep adding commits/merge requests without penalty
- if your methods (for
Product.javaandStaff.java) have the wrong name, you should add new methods rather than deleting them (to workaround the check that prevents you from deleting others’ code) - please post on Ed or come to office hours if you need extra help!
- If you run
git statusand see"Your branch is ahead of 'origin/main' by N commits", your local branch has commits that have not been pushed to remote yet. gitwill not allow you to pull updates into your repo while you have unstaged changes. Therefore, you need to firstgit addand commit your changes before pulling.
(Optional) Task 2: Use the website¶
The repository contains a rudimentary static site generator, which is a type of software that converts text input into a website (made of HTML, CSS, and JS). This one is far from complete (there are many, many great ones — MkDocs makes the 391 website!), but is intentionally written with a subset of Java that almost only uses features taught in intro.
If you’d like, you can actually browse the output of the site and fiddle around! This isn’t strictly necessary for your grade, though it may help you debug why the site doesn’t work the way you expect.
The “Easy” Way¶
We’ve set up something called “continuous deployment” that rebuilds and deploys the site on each commit to the main branch. You can visit the site at https://cse391.pages.cs.washington.edu/24su/faang/.
But, it’s more fun to do it yourself, with…
The “Hard” Way: Build it Yourself!¶
You can compile all the Java files in the repository’s root directory and then run the GenerateSite program (the entrypoint for this site generator).
javac *.java && java GenerateSite
This will produce an index.html file that contains a list of all the products and staff, as well as individual .html files for each product and employee.
To view the website, you have a few options:
- If you’re working locally you can navigate to the
faangdirectory using Finder (macOS) or File Explorer (Windows) and double click on theindex.htmlfile. This should open the website in your default web browser. - If you’re working on
attu(orvergil, etc.) you will need to copy your files over to your local machine to view them.scp’s-rflag helps you copy folders (rather than individual files); here’s one example:scp -r CSENetID@attu.cs.washington.edu:/path/to/faang . - If you’re working on the VM, you can use the File Manager application to navigate to the
faangdirectory and double click on theindex.htmlfile, which should open the site in Firefox.
Note: we’ve intentionally added some items to our .gitignore that can be built from source. In particular, compiling the .java files produces .class files, and running GenerateSite creates the .html files. As a result, we’ve chosen not to commit these files, since they “duplicate” information.