WeblateOrg / weblate

Web based localization tool with tight version control integration.
https://weblate.org/
GNU General Public License v3.0
4.64k stars 1.02k forks source link

Add rebase and squash merge style #2102

Closed nijel closed 5 years ago

nijel commented 6 years ago

Currently there are merge and rebase merge styles in Weblate. It might be useful to have additional one which would rebase commit and squash them. It would squash commits from same author and same file, using commit message from last one. This would be useful for projects who want to minimize amount of translation commits.

It might be either supported natively in Weblate VCS layer or as an addon. Having it as addon seems more reasonable to me as this is probably going to be supported only for Git.

nijel commented 6 years ago

It could be probably done with git filter-branch see https://stackoverflow.com/a/38872224/225718

eighthave commented 6 years ago

Yeah, git filter-branch can do that. It would need to filter based on file and author in the first pass. Then there would need to be a rebase with fixup commits to merge all the consecutive commits by the same author. For example, a list of commits modifying the same, labeled by author:

Would become:

I suppose it would be even nicer if it was down to just two commits, one for foo and one for bar, but that seems trickier. I suppose it could try the rebase to see if it works, and otherwise only squash consecutive matching commits.

nijel commented 6 years ago

Hmm, but the same author commits probably won't be next to each other in most cases. Probably it would be better to use GIT_SEQUENCE_EDITOR (or setting sequence.editor) and git rebase -i to achieve desired behavior.

BhaaLseN commented 6 years ago

Any thoughts on adding a(nother) commit style that sacrifices the VCS author information in favor of a single commit that includes author information in the commit message? Perhaps even with an option to have a single commit per language (one language/file, mulitple users) vs. a single commit for everything (multiple languages/files, multiple users)?

nijel commented 6 years ago

That's option as well. The difference is that contrary to rebase approach it won't deal with already committed and not yet merged changes. Currently commit_pending is responsible for groupping changes by author into commit:

https://github.com/WeblateOrg/weblate/blob/3a4f92cc1ee2b99e275d3c2d43abeb711cb64dcd/weblate/trans/models/translation.py#L397-L431

BhaaLseN commented 6 years ago

I just came across another interresting case in our installation. We have one project with ten components (one of them is a real Git repo, the other nine are links with enabled translation propagation) and one of our translators made changes in two languages. The result was 17 commits across pretty much all of the components with a mix of languages; sometimes alternating between the two and sometimes multiple components for the same language, then for the other.

Consolidating those into fewer commits (in this case: all from the same author; so perhaps one commit as "per author" style or two commits "per language" style) would be something nice, especially in the propagation case.

nijel commented 6 years ago

@BhaaLseN This really should be much better in recent versions, what version do you use?

BhaaLseN commented 6 years ago

I'm still on 3.0.1, but the next maintenance window is coming up so I'll be looking forward to it!

nijel commented 6 years ago

Some of the changes are not even in 3.1, see https://github.com/WeblateOrg/weblate/issues/2157.

BhaaLseN commented 6 years ago

That does look a bit like half the commits I saw there; but won't change that fact that we're still going to upgrade to the most recent one soon, nor the fact that I'm looking forward to more/other/different styles in the future.

nijel commented 5 years ago

Full squash could be done by following (based on https://stackoverflow.com/a/29310055/225718):

message=`git log --format=%B origin/master..HEAD`
git reset --soft origin/master
git commit -m "$message"
eighthave commented 5 years ago

Seems like that nice little hack would then make it easy to do per-language commits, something like:

declare -A messages
for locale in $locales; do
  messages[$locale]=`git log --format="%an <%ae>" origin/master..HEAD  locale/${locale}/LC_MESSAGES/fdroidserver.po  | sort -u`
done
git reset --soft origin/master
for locale in $locales; do
  git commit -m "${messages[$locale]}"   locale/${locale}/LC_MESSAGES/fdroidserver.po
done
nijel commented 5 years ago

WIP implementation: https://github.com/WeblateOrg/weblate/pull/2462

nijel commented 5 years ago

I've just merged #2462 adding support to squash all, per file or per language. Squashing per author still missing.

BhaaLseN commented 5 years ago

Haven't looked at it yet, but does (or will) it support per language on linked repositories? I got one project with 12 components that all target different sets of files inside the same repository (and also propagate changes between them); where I'd like to see a total of 3 commits if de/en/fr were changed (even if 36 files were affected by this)

nijel commented 5 years ago

Yes, per language works across all linked repos (that's why there is per language and per file).

eighthave commented 5 years ago

how you implemented per language sounds great!

eighthave commented 5 years ago

How would we try this on an fdroid component? I couldn't see anything in the settings.

@matrixcoffee FYI

nijel commented 5 years ago

It's an addon, configure and install it on https://hosted.weblate.org/addons/f-droid/f-droid/

eighthave commented 5 years ago

I'm still stumped on this. I've enabled the addon in two projects and set them to "per-language" and "per-file":

But they don't seem to do the squashing at all. Do I have to do something to trigger it?

nijel commented 5 years ago

The squash currently happens on push only and you don't have enabled that. Probably something what needs to be addressed...

nijel commented 5 years ago

...what makes little sense, it really should be done after every commit. I've changed that in https://github.com/WeblateOrg/weblate/commit/27a88856e18eb6780c9f106e2e79bd11a363665d, will be deployed once the tests pass.

eighthave commented 5 years ago

So I just tried it with this: https://hosted.weblate.org/projects/f-droid/repomaker/#repository.

eighthave commented 5 years ago

Maybe it is related to this component, which shares the same git repo, does not have "Squash Git commits" as an available Addon.

nijel commented 5 years ago

The problem now is that "commit" does only commit if there are some pending changes ;-).

As there is no translation in language I know, I've tested it on the fdroidserver and it seems to work fine - I've made two commits there and the updates were squashed per file as configured.

eighthave commented 5 years ago

FYI, the new Fastlane support #1525 does not seem to get squashed by the addon, as seen in https://hosted.weblate.org/projects/f-droid/f-droid/

eighthave commented 5 years ago

It is set to per-language squashing

eighthave commented 5 years ago

Hmm, two languages just got squashed. It seems that it will only squash if there is a new commit on the primary component (e.g. f-droid/f-droid), while it does not squash when there are new commits on the secondary component (e.g. f-droid/f-droid-metadata).

nijel commented 5 years ago

Your guess is correct, I've just addressed this case in 0155dfc73690b7b7a678fa3b6bf1c89006f5f4bb. No schedule for deploying this fix yet...

eighthave commented 5 years ago

Something strange is going on with https://hosted.weblate.org/projects/f-droid/f-droid/ which seems related to this new feature but might also be related to the new Fastlane support.

    Translated using Weblate: Basque (eu) by Osoitz <oelkoro@gmail.com>

    Currently translated at 100.0% (428 of 428 strings)

    Translated using Weblate (Turkish)

    Currently translated at 63.2% (12 of 19 strings)

    Translation: F-Droid/F-Droid metadata
    Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/

    Translated using Weblate (Turkish)

    Currently translated at 63.2% (12 of 19 strings)

    Translation: F-Droid/F-Droid metadata
    Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/tr/

    Translated using Weblate (English (United States))

    Currently translated at 100.0% (18 of 18 strings)

    Translation: F-Droid/F-Droid metadata
    Translate-URL: https://hosted.weblate.org/projects/f-droid/f-droid-metadata/en_US/

    Translated using Weblate: Esperanto (eo) by Hans-Christoph Steiner <hans@guardianproject.info>

    Currently translated at 99.8% (427 of 428 strings)

    Translated using Weblate: Esperanto (eo) by Verdulo <tomek@disroot.org>

    Currently translated at 99.8% (427 of 428 strings)

-------------------- app/src/main/res/values-eo/strings.xml --------------------
nijel commented 5 years ago

I've already fixed the repo manually meanwhile. Fixed in Weblate by 1394442e2e380d6b49c28632cf2b58381e523f50

nijel commented 5 years ago

Thank you for your report, the issue you have reported has just been fixed.