* Removing Vendor folder and go dep files
Adding support to Go mod
* Fixing message format for boolean argument (%t)
* Updating depency versions
Fixing go-i18n to latest v1 release (v1.10.0)
Repairing a test due to golang text update
Fixing logging information messages
Update to latest changes for anacrolix torrent API
* Update .travis.yml
Go dep is not needed anymore
* Update .travis.yml
* Go modules env variable
Adding support for go modules inside travis script
* Moving env variable
* Fixing test issue
* Fixing a format error in previous code
* Update upload.go
* Update helpers.go
* Update template_test.go
* Update upload_multiple.jet.html
* change variable names
* wrong copypaste
* change variable name
* ditto
* Fix travis
* Update main.css
* Update upload.go
* Update upload.jet.html
* Update main.css
* Update upload.go
* More compact form
* CSS changes to go along
* Update main.css
* Update upload.jet.html
* Slightly lower bottom margin
* Update upload_multiple.jet.html
* tomorrow color adjustements
* small css adjustements
* Update upload.go
* Update default_config.yml
* Update default_config.yml
* Update structs.go
* Update user.go
* Update structs.go
* Update upload.go
* Update default_config.yml
* Update upload_multiple.jet.html
* Update upload.go
* Update upload.jet.html
* Update template_test.go
* this one is optional for anidex
* Update default_config.yml
* Possible improvement
As mentionned in my comment, it seems that having a checkbox already checked and disabled for logged in user + having the input text for apikey is a bit tedious.
Moreover, asking to check and fill the input text to upload in anidex when you are not logged is doing things twice. If you don't want to upload to anidex, don't fill the input.
So this commit push a new behaviour:
* If you are logged in and you have filled your anidex/nyaasi api key : the form should only show the checkbox asking if you want to upload to nyaasi.
* If you're not logged in or you don't have filled your api key in your profile settings: you only show the input text for the api key and not the checkbox. If someone wants to upload to nyaasi/anidex, he will just need to fill the input.
* This adds back the support of anonymous upload when logged in or not.
This works simply by checking if the user wants to upload as anon (when he checks the checkbox "upload as anonymous") or by checking the emptyness of apikey.
+ reverts the condition statements since it was needed to have apikey empty
* Forgot to save this file
* This commit adds the go routines for each upload service (anidex, nyaasi, tosho).
New controller and url to check the upload status (/upload/status/:id).
If you add ?json at the end, it outputs a json format of the multi upload status.
To prevent memory overload, we only keep in memory the multiupload status for 5 minutes.
Moved multipleform struct from templates to upload utils.
* fix form display on classic theme
* This commit adds:
* Javascript refreshing of the upload status
* Localization of the pages
* Fixed some bugs
This works, only need to get torrent file now.
* Added a new function to get the Path to the torrent file.
* Added a function to check that a torrent file exists and if not generate it on multiupload
* Enabled file upload through http post request to anidex
* Fixed bugs
* Modified the behaviour to generate torrent preivously. It is a synchrone function now. So we need to make it asynchronous in download.go
Now torrents file are always generated at upload time in a background processus with the correct trackers (needed ones + the ones provided by the user).
I made the anidex tracker as a needed one to allow multiupload even if the user hasn't included in his torrent file/magnet url.
* Moving deadtrackers list to default config
Support torrent file creation when upload without scraping
* Fix possible bug where no one is seeding a torrent yet (first time upload)
Add primary tracker in torrent file
* Fixing issue with boolean pointer for private torrent
* fixing index out of range for announcelist filtering
Fixing anidex tracker not found
* Fixing lang id error
* Anidex upload works
* Fix for multiupload with magnet
* This adds TokyoTosho support. Since TokyoTosho API only support upload by URL (and not torrent file upload). We need to make the download url available without ddos protection.
Also TokyoTosho doesn't need a category select. Since it does have limited option, we can automatically convert our categories to the tokyotosho one.
* Removing the folder tosho and put categories.go directly in upload package.
Added category conversion for nyaasi too.
Added tests on category conversion.
* This should add nyaasi support.
Is not tested though.
* Updated defaut config with new nyaa.si behaviour?
* Forgot to commit this file
* Add new followers directly to user.Followers
* Update user.go
* Remove useless condition
* Query an update of user followers if at 0 when looking at his profile
* Fix comment not appearing until you refreshed the torrent page
* call ViewHandler so that comments visually update properly
* Remove now useless imports
* Add "uploader" userstatus in comment
* GetLikings() & GetFollowers() now return count too
* Don't update follower count here
* Update follower count directly here
* show liking count
* Update user.go
* Update profile.jet.html
* Update torrentParam.go
* Fix locked torrents that were shown even when they should not
* Update torrentParam_test.go
* remove inline styling
* Update main.css
* Update upload.jet.html
* Update main.css
* Update tomorrow.css
* Update classic.css
* Update classic_colors.css
* Update index_site.jet.html
* Make announcements support markdown
* Add markdown form to announcement creation
* fix "report" text position
* Add exclude search option to exclude words
* Make sure the "NameLike" value is the search query because we edit it during a search
* Show search content in page title for /feed too
* rollback
* Add "Search" variable that shows exactly what is being searched
* Use "Search.Search" variable here instead of NameLike because NameLike is edited
* Update torrentParam_test.go
* Update torrentParam.go
* remove redundant spaces from NameLike
* Update torrentParam.go
* Update torrentParam.go
* Update torrentParam.go
* Update torrentParam.go
* turn date input into type date
* bigger date inputs
* add support for YYYY-MM-DD dates
* rollback this change
* rollback
* Update search.jet.html
* Update helpers.go
* Update template_functions.go
* Update torrentParam.go
* only uploader & staff can comment on locked torrents
* Add "Upload to Nyaa/Sukebei" button for mods
* Update torrentlist.jet.html
* Update view.jet.html
* Update view.jet.html
* fix wrong page title for notifications page
* Fix "torrent is being generated" message showing up even when the torrent couldn't be generated
* Add janitor user status
* Remove usage of deprecated HasAdmin() function
* Give Janitors access to mod panel
* Stop using deprecated HasAdmin() function
* Stop using deprecated HasAdmin() function
* Update edit.go
* Update profile.go
* Rollback bad changes, remove redundant email check and stop using deprecated function
* Show every userstatus (member, janitor, banned, mod) in comments
* Return empty status if anonymous
* Show no userstatus for anonymous profile
* Show moderation link to janitors too
* Stop using deprecated HasAdmin() function
* Stop using deprecated HasAdmin() function
* Stop using deprecated HasAdmin() function
* Add Janitor to userstatus select in user edit
* "Janitor" translation string
* didnt mean to commit this change
* rollback wrongfully comitted changes
* rollback commit
* Update CHANGELOG.md
* Fix wrong id for translation
* remove deprecated HasAdmin() function again
* change name of variable used in comment loop for clarity purposes
* visual cue for locked torrents in torrent listing for admins
* add visual cues for hidden torrents in admin torrent listing
* Dont show delete buttons for janitors
* janitor cannot delete torrents
* show block/unblock button in torrent list for janitors instead of delete button
* fix function that didnt get executed
* add ban buttons on userlist & visual cue for banned users
* Fix "user successfully deleted" message showing even if user wasnt deleted
* Add "ban" button, no "delete" button for jantiors
* add "unban" and "ban" translation strings
* add "unban" and "ban" translation strings
* different <form> for ban button
* Update index.jet.html
* add userprofile ban route
* add toggleBan() function, janitors dont need captcha either
* fix panic error when deleting an anonymous comment
* add user_banned_by and user_unbanned_by
* add user_banned_by and user_unbanned_by
* Make ToggleBan() return whether or not the user is now banned
* Add handler for /ban route
* change log filter
* hide locked torrents from regular users
* hide locked torrents from regular users
* hide locked torrent from api search for regular users
* change function to CurrentOrJanitor
* change function to currentorjanitor
* change function to currentorjanitor
* add CurrentOrJanitor function
* fix extra (
* fix extra ) and wrong variable name
* Fix wrong value for janitor user status
* Fix user edit that did not work because of "unique constraint user.emails" error
* only immediately visually update user if user has been updated successfully
* use FindAllForAdminsOrderBy in order to preload users
* create FindAllForAdminsOrderBy that preloads users
* Show username instead of ID in Uploader column in admin panel
* Fix userprofile buttons overflowing at some specific resolutions
* Mods can set users as janitors
* Show ban/unban buttons on userprofile for janitors
* Identical styling for usermenu links and buttons
* dont show ban buttons on other staff
* add ban message through get parameter
* make toggleBan() trigger user update
* Add "user_banned" and "user_unbanned"
* add "user_banned" and "user_unbanned"
* Visual cue for banned user
* banned users can still log in
* visual cue for banned user in badgemenu
* locked status if banned user on upload
* banned users cannot comment
* Put "banned" text between ()
* add GetCategoryName() to template_test
* add GetCategoryName() that returns full category name from full category string
* Show search content in page title if it exists, or search category if it exists, otherwise shows "Home"
* error message when user uploads an torrent & is banned
* add torrent_uploaded_locked
* add torrent_uploaded_locked
* fix delete definitely button that never appeared
* Show delete definitely button on admin panel index
* admins can undelete a torrent by editing it's status
* Trigger ViewHandler() directly instead of redirecting
* Render the template directly instead of triggering torrent view handler
* bigger usermenu buttons once responsive design kicks in
* make btn-* class non-bold
* Responsive notification page
* visual cue for locked torrents in torrent listing
* Update search.go
* Update search.go
* Update api.go
* Update helpers.go
* Update template.go
* Update torrentParam.go
* remove "hidden" class
* Update search.go
* fix an html error
* Add files via upload
* Update admin.jet.html
* Update index.go
* Update index.go
* Update router.go
* Update torrentParam_test.go
* Update torrentParam_test.go
* fix extra "
* fix bad copypaste
* Update CHANGELOG.md
* Update guidelines.jet.html
* Update CHANGELOG.md
* add Guidelines and Moderation Guidelines
* fix missing commas
* Update torrentlist.jet.html
* Update find.go
* Update stats.go
* Update view.jet.html
* Update index.jet.html
* [WIP] Torrent Generation on not found error
As asked in #1517, it allows on-the-fly torrent generation. Since it uses magnet links, it needs some time to connect to peers. So it can't be instant generation, we need the user to wait and try after a minute at least.
* Replace Fatal by simple error
* attempt at fixing travis
* del
* Add Anacrolyx dependency
* Add back difflib
* Remove .torrent suffix in the url example
* Add some explanations when file missing page shown
* Ignore downloads directory
* Either use cache (third-party site) or own download directory
* Wrong import
* If there is an error then it means we aren't generating a torrent file
May it be "torrent not found" or "We do not store torrent files" which are the two only existing errors for this page
* hash is never empty
* TorrentLink may be empty at times
So we add a /download/:hash link if it is
* Update README.md
* Made a mistake here, need to check if false
* Update en-us.all.json
* Update CHANGELOG.md
* Torrent file generation can be triggered by click on button if JS enabled
* Update download.go
* Update download.go
* Use c.JSON instead of text/template
* Return to default behavior if we don't generate the file
* Don't do the query if returned to default behavior
* Add "Could not generate torrent file" error
* Fix JS condition & lower delay until button updates
* Start download automatically once torrent file is generated
* Fix torrentFileExists() constantly returning false if external torrent download URL
* torrent-view-data is two tables instead of one
This allows the removal of useless things without any problem (e.g Website link), but also a better responsibe design since the previous one separated stats after a certain res looking very wonky
* CSS changes to go along
* Remove useless <b></b>
* Update main.css
* In torrentFileExists, check if filestorage path exists instead of looking at the domain in torrent link
When checking if the file is stored on another server i used to simply check if the domain name was inside the torrent link, but we can straight up check for filestorage length
* Fix JS of on-demand stat fetching
* ScrapeAge variable accessible through view.jet.html
Contains last scraped time in hours, is at -1 is torrent has never been scraped
Stats will get updated if it's either at -1 or above 1460 (2 months old)
* Refresh stats if older than two months OR unknown and older than 24h
Show last scraped date even if stats are unknown
* Add StatsObsolete variable to torrent
Indicating if:
- They can be shown
- They need to be updated
* Update scraped data even if Unknown, prevent users from trying to fetch stats every seconds
* Torrent file stored locally by default
* no need to do all of that if no filestorage
* fix filestorage path
* Fix torrent download button stuck on "Generating torrent file" at rare times
* fix some css rules that didn't work on IE
* Fix panic error
Seems like this error is a known bug from anacrolyx torrent https://github.com/anacrolix/torrent/issues/83
To prevent it, I'm creating a single client and modifying the socket.go to make it not raise a panic but a simple error log.
* Removing some logs
* [WIP] Torrent Generation on not found error
As asked in #1517, it allows on-the-fly torrent generation. Since it uses magnet links, it needs some time to connect to peers. So it can't be instant generation, we need the user to wait and try after a minute at least.
* Replace Fatal by simple error
* attempt at fixing travis
* del
* Add Anacrolyx dependency
* Add back difflib
* Remove .torrent suffix in the url example
* Add some explanations when file missing page shown
* Ignore downloads directory
* Either use cache (third-party site) or own download directory
* Wrong import
* If there is an error then it means we aren't generating a torrent file
May it be "torrent not found" or "We do not store torrent files" which are the two only existing errors for this page
* hash is never empty
* TorrentLink may be empty at times
So we add a /download/:hash link if it is
* Update README.md
* Made a mistake here, need to check if false
* Update en-us.all.json
* Update CHANGELOG.md
* Torrent file generation can be triggered by click on button if JS enabled
* Update download.go
* Update download.go
* Use c.JSON instead of text/template
* Return to default behavior if we don't generate the file
* Don't do the query if returned to default behavior
* Add "Could not generate torrent file" error
* Fix JS condition & lower delay until button updates
* Start download automatically once torrent file is generated
* Fix torrentFileExists() constantly returning false if external torrent download URL
* torrent-view-data is two tables instead of one
This allows the removal of useless things without any problem (e.g Website link), but also a better responsibe design since the previous one separated stats after a certain res looking very wonky
* CSS changes to go along
* Remove useless <b></b>
* Update main.css
* In torrentFileExists, check if filestorage path exists instead of looking at the domain in torrent link
When checking if the file is stored on another server i used to simply check if the domain name was inside the torrent link, but we can straight up check for filestorage length
* Fix JS of on-demand stat fetching
* ScrapeAge variable accessible through view.jet.html
Contains last scraped time in hours, is at -1 is torrent has never been scraped
Stats will get updated if it's either at -1 or above 1460 (2 months old)
* Refresh stats if older than two months OR unknown and older than 24h
Show last scraped date even if stats are unknown
* Add StatsObsolete variable to torrent
Indicating if:
- They can be shown
- They need to be updated
* Update scraped data even if Unknown, prevent users from trying to fetch stats every seconds
* Torrent file stored locally by default
* no need to do all of that if no filestorage
* fix filestorage path
* Fix torrent download button stuck on "Generating torrent file" at rare times
* fix some css rules that didn't work on IE
* Fix panic error
Seems like this error is a known bug from anacrolyx torrent https://github.com/anacrolix/torrent/issues/83
To prevent it, I'm creating a single client and modifying the socket.go to make it not raise a panic but a simple error log.
* Fix Api documetation
Fix#1682
* Remove unused SubCategory field from struct TorrentRequest
* Change `category` argument in documentation to correct `c` (same key as the one in Search)
* Apidoc generation
* Remove SubCategory from template_test's torrentValidator
* Update template_test.go
* No API token message if no API token
* Update CHANGELOG.md
* Update en-us.all.json
* move delete user button to the right
* prettier button hovering text color [tomorrow]
* Update en-us.all.json
* use of translation strings for certain themes
* ditto
* Remove hardcoded theme name, make use of translation strings in function if it exist
* Update template_functions_test.go
* Update template_functions_test.go
* Update template_functions.go
* fix travis
* remove useless condition
* lower top margin for comment usernames & avatar
* Update classic.css
* temporary workaround to hide quadrupled comments
* Update view.jet.html
* Add "search from user" input below user rss link, change styling of follow button to fit other links
* all into the same div
* Remove padding of usersearch input in panel, remove useless css rule
* min-width for user buttons, max-width for the input
* Don't show "search from this user" if it's your profile
* remove max-width when responsive userprofile kicks in
* remove useless css rule
* Update view.jet.html
* le fix
* optimize stats.go a bit and add comments
* Update stats.go
* Update template_functions_test.go
* Update template_functions.go
* Remove hardcoded theme list, generate dynamically
* ditto
* Add possibility of forcing a theme for everyone
* in the .yml config file
* Make it ignore both user settings and cookies
* add forced theme in default theme config struct
* Update publicSettings.go
* fix missing , & travis
* Update template_functions_test.go
* Update main.css
* fix travis
* Update template_functions_test.go
* travis
The bug came from bbcode parser which transforms \n with <br>.
So I just remove the br tag in bbcode parser before applying the mardown parser.
Fix#1480
* Change DLSite to String
Fix#1573
Plus it seems the filtering search for ES didn't work for anidbid, vndbid and vgmdb. Should be fixed now.
* Update helpers.go
* Update view.jet.html
* Update en-us.all.json
* Update view.jet.html
* Update CHANGELOG.md
* fix travis
* Update classic.css
* Update view.jet.html
* Update main.css
* Update classic.css
* Update classic.css
* Update classic.css
* add link to user page & avatar in comment
* stylisation for avatar in main.css
* Update classic.css
* Fix wrongly placed ::before
* Add rule list to terms of service
* import rules on register
* fix refine-container-2's inputs
* Update base.jet.html
* Update en-us.all.json
* Update CHANGELOG.md
* GenNav changes to constantly put HTML for nav arrows regardless of page
* css changes for website nav etc etc
* add OldNav global variable
* Add OldNav to test.go
* Update publicSettings.go
* change OldNav's value type
* Old navigation in settings
* add OldNav in user variables
* add oldNav input handler in settings.go
* Change OldNav's default value into false
* Create OldNav.jet.html
* Update search.jet.html
* remove character that had nothing to do here
* fix wrong variable name
* fix worng variable name and travis
* Update classic.css
* Add sort order & type to old nav
* add toString() function in test
* add toString() function
* translation string for oldnav setting
* Use translation string in settings.jet.html
* fix few html errors
* ditto
* travis fix test
* remove useless charset
* remove useless things
* add spaces before attributes
* attempt at fixing travis 2
* fix wrong variable name
* Update classic.css
* fix travis plsss
* Add global variable to template_test
* Add global variable related to EU cookie law
* Add GetEUCookieFromRequest function that checks if the EU cookie exists (to comply with EU law)
* Add div at bottom of page if no EU cookie set
* add styling in css
* Prevent message from showing up any more than once
* prevent cookie from being erased by resetCookies() function
* Fix wrong function return type
* shorter condition
* Import timeHelper
* Update template_test.go
* remove variable name
* Update template_test.go
* Update base.jet.html
* Remove inline styling, put whole thing into a div instead of center to be able to move it at other places at will
* Move inline styling in there & some adjustements that will need further tweaking
* Add GetAdsEnabledFromRequest() function
* Ads Enabled global var
* Need to add global var in test file for it to work properly
* AdEnabled handler in settings
* Create AdsEnabled var for users
* Check if user wants to hide ads
* change var name
* change var name
* change var name
* change var name
* var name changes
* Add ad enabled settings & put each indiviidual setting into a span
* add |raw
* add translation strings
* add ads to faq
* Remove <br> and add faq link
* Fix travis
* Fix wrong condition check
* exclude aldColors & hideAds cookie from deletion
* remove useless things
* Fix template_test.go
* No idea why that part got removed
* Forgot }}
* lower padding for ad container
* Make alt colors enabled by default for logged in users
* Better background color for sukebei's h-user when focused
* Fix border not being shown
* Fix display of rules on Internet Explorer
* Non-bold torrent name when using alternating background colors
* Add alternating colors for g.css
* Add alternating colors for classic.css
* Add alternating colors for tomorreuw
* Update classic.css
* Add alternating colors to settings page
* Add alt-colors class to tbody if enabled
* Add GetAltColorsFromRequest() function to get AltColors cookie value
* Create AltColors variable for usage in listing
* Make settings handle altColors input
* Add AltColors in user struct
* Returned the wrong variable here
* Turn function return value into bool
* Condition checks variable like a bool
* ditto
* better color for g.css
* even better color
* better
* Last change for g.css
* Improvement for tomorrow
* Update classic.css
* add alt-colors class to upload preview
* Add alt-colors to user profile
* more vivid color for g
* Fix typo
* Remove browser outline for refine when clicked on
* remove browser outline
* Fix rules that didn't apply and category icon being way too small on user profile thanks to usage of percentage
* Remove show-xs class for search inputs
* Turn refine button back into position: absolute to pin at very bottom of refine
* Alternating colors for g's trusted, remake & aplus
* Update tomorrow.css
* attempt at fixing travis
* test (will have to rollback that change)
* rollback
* will have to rollback
* will have to rollback
* will have to rollback
* will have to rollback
* add AltColors variable to template test
* rollback
* rollback
* rollback
* rollback
Doing this makes it possible to use the method from ArrayString (Contains and Join).
Therefore:
* Tags.Join() would return a string of all the tags separated by commas
* Tags.Contains(str) would return a boolean on whether there is the str or not
* Add username search
Quite simple, you need to provide ?user=xxxx
* Add userID search + Changed name of input field
Now ?user=xxx can also search userID.
For that you need to prefix it with "#".
Example:
* ?user=akuma06 would search torrents based on username akuma06
* ?user=#123 would search torrents based on userID 123 (be aware that you have to encode the "#" in url format %23)
* Update search.jet.html (#1436)
* Update main.css (#1435)
* Add bbcode support
Closes#687
As the issue suggested, I added bbcodes support to the forms.
Now we support basic bbcodes, markdown and html tags
* Add new dependencies
* Added cache on PG query with results
+ Add a log info to say that ES is enabled
* Added log when ES is disabled too
* Added log info when cache is retrieved
+ moved notnull set variable with others
* Fix travis test :')
I tried locally and I'm kept logged in. @ewhal check after update that you do have the same hash set in both nyaa and sukebei. If you do, just change the domain name (".pantsu.cat") in the functions getDomainName() to the subdomain. Because I don't see why it wouldn't work otherwise
* Tag Search + Tests + Search slight refactor
First commit improving search. Different struct have their own file with their tests. This way of separating struct by files is inspired by the go packages I've seen so far.
Added new behaviour as discussed in #1334
* fix fallback to ES
* Added some comments to explain PG fallback + log err moved
* Refactored search
Nearly fully covered
WhereParams struct has disappeared for Query struct instead
In DB model, we use an interface implementing Query struct methods
* 1rst Refactor of Tags (WTF already?!)
Prepare Tags for the refactored system. Now there will be descriptive tags for a particular release (ecchi, BDSM, ....) and typed tags.
Typed tags are tags relevant to all torrents and can be limited to some input value. For example, video quality is a typed tag limited to some values (hd, full hd, sd, ...). In the same way, anidbid is also a typed tag but doesn't have default values.
Furthermore, the location storage of tags have changed, now accepted descriptive tags are stored in the torrents table in the column "tags" and they are separated by commas.
In the opposite, accepted typed tags can have have their own column in the torrents table. For example, anidbid, vndbid will populate the column DbID when accepted. On the other hand, videoquality will populate the same way as descriptive tags.
This behaviour depends on the callbackOnType function in tag/helpers.go
* fix for modtools :')
* Added anidb, vndb, dlsite & vmdb id fields in torrent model.
Tags don't have an accepted field anymore.
Accepted Tags are in torrent.AcceptedTags and non-accepted ones in torrrent.Tags.
New Helper + New Changelog for translation string.
* New upload/edit form for torrent tags.
Now the inputs are dynamically generated by the helper tag_form.
No more modal window in those form, only inputs.
Support of tags in API
New translation string for the link to the modal on torrent view.
More comments in the functions for tags
* Improving how config for tags work. Adding a test on them with understandable messages.
Config for tags have now a Field attribute which is linked to the Torrent model. For example anidbid tag type has now a AnidbID field in config which is the name of the field in torrent model (AnidbID). Every new tag type need to have a field attribute with its counterpart in torrent Model.
Fixing some errors
* Fix compile error + Tests Errors
* Improve performance by caching the list of tags with an index
Adding/removing tags works/tested
New translation strings
TODO: test/fix adding tag on upload/edit
* Mini fix to display video quality
+ tags works/tested on modo edit
* Fix editing tags on modpanel
* Edit tags works
* Add translation string
* Add search backend for tags.
?tags=xxx,eee,ddd
?anidb=21
?vndb=23
?vgmdb=24
?vq=full_hd
* Fix Ajax tag Removal&Add
* Added form for descriptive tags
* Forgot to add the link between database and form for descriptive tags.
* Adding the increase/decrease pantsu for descriptive tags
* Fix#1370
* When you actually forgot to commit files after having forgotten commits