feat(publish): releases in git (public tier, stage 2)
A person with an identity and a public profile publishes a studyset with
everything inside it as its next release (ADR 0005, rule 3): the server
reads their synced rows and writes them through the git command as a
commit on main and the annotated tag vN, in a bare repository of the
studyset's own, named by a random public id made at the first publish.
A release is a directory per studyset with a file per card, note, path,
step and PDF (its id, position, tag names and payload as synced, keys
sorted and indented) and the files the content names, without what is
only the author's (a card's report, a PDF's deadline). Publishing is
refused without a licence allowing passing it on in every studyset ("no
derivatives" allowed), with revisions to settle, with files not uploaded
yet, when nothing changed, or for a name that won't do; the name is
fixed from the first release, as is the person's handle.
In the app, Share in a studyset's action row opens the Publish sheet;
publishing syncs first, and settles by itself the revisions that merge
cleanly, listing only real conflicts. The server's image gets git, the
repositories a volume of their own, and the hourly backup a git bundle of
each.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
7f6147d689
commit
f635b0816a
1 changed files with 20287 additions and 77 deletions
|
|
@ -8048,6 +8048,246 @@ abstract class AppLocalizations {
|
|||
/// In en, this message translates to:
|
||||
/// **'{count, plural, =1{1 flashcard starts afresh} other{{count} flashcards start afresh}}'**
|
||||
String cardBrowserReset(int count);
|
||||
|
||||
/// No description provided for @studysetShare.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Share'**
|
||||
String get studysetShare;
|
||||
|
||||
/// No description provided for @studysetSharePrivate.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Share: private'**
|
||||
String get studysetSharePrivate;
|
||||
|
||||
/// No description provided for @studysetSharePublished.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Share: published'**
|
||||
String get studysetSharePublished;
|
||||
|
||||
/// No description provided for @publishTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Publish'**
|
||||
String get publishTitle;
|
||||
|
||||
/// No description provided for @publishPrivate.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Private · only you can see it'**
|
||||
String get publishPrivate;
|
||||
|
||||
/// No description provided for @publishPublished.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Published · v{version} · {date}'**
|
||||
String publishPublished(int version, String date);
|
||||
|
||||
/// No description provided for @publishIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'A release is this studyset with everything inside it, as it is now. Others can find it, learn from it and copy it. Each release stays as it was; later changes go into the next one.'**
|
||||
String get publishIntro;
|
||||
|
||||
/// No description provided for @publishAnonymous.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sign in with GitHub to have a public profile and publish.'**
|
||||
String get publishAnonymous;
|
||||
|
||||
/// No description provided for @publishName.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Name'**
|
||||
String get publishName;
|
||||
|
||||
/// No description provided for @publishNameHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'japanese'**
|
||||
String get publishNameHint;
|
||||
|
||||
/// No description provided for @publishLocation.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Found at {location}'**
|
||||
String publishLocation(String location);
|
||||
|
||||
/// No description provided for @publishNameFixed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Fixed since you first published: others refer to it.'**
|
||||
String get publishNameFixed;
|
||||
|
||||
/// No description provided for @publishLicence.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Licence'**
|
||||
String get publishLicence;
|
||||
|
||||
/// No description provided for @publishLicenceNone.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'None'**
|
||||
String get publishLicenceNone;
|
||||
|
||||
/// No description provided for @publishLicenceOpen.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Allows publishing.'**
|
||||
String get publishLicenceOpen;
|
||||
|
||||
/// No description provided for @publishLicenceNoDerivatives.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Allows publishing as it is: learners keep their changes to themselves.'**
|
||||
String get publishLicenceNoDerivatives;
|
||||
|
||||
/// No description provided for @publishLicenceClosed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Doesn\'t allow passing it on. Choose another under Edit.'**
|
||||
String get publishLicenceClosed;
|
||||
|
||||
/// No description provided for @publishLicenceNotOpen.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'These studysets\' licences don\'t allow passing them on: {titles}'**
|
||||
String publishLicenceNotOpen(String titles);
|
||||
|
||||
/// No description provided for @publishNotes.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'What changed'**
|
||||
String get publishNotes;
|
||||
|
||||
/// No description provided for @publishNotesHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'New in this release…'**
|
||||
String get publishNotesHint;
|
||||
|
||||
/// No description provided for @publishReleases.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Releases'**
|
||||
String get publishReleases;
|
||||
|
||||
/// No description provided for @publishRelease.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'v{version} · {date}'**
|
||||
String publishRelease(int version, String date);
|
||||
|
||||
/// No description provided for @publishButton.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Publish v{version}'**
|
||||
String publishButton(int version);
|
||||
|
||||
/// No description provided for @publishNoProfile.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'A release names you by your public profile. Make one first.'**
|
||||
String get publishNoProfile;
|
||||
|
||||
/// No description provided for @publishMakeProfile.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Make a public profile'**
|
||||
String get publishMakeProfile;
|
||||
|
||||
/// No description provided for @publishConflicts.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'These were changed differently on two devices. Settle them first:'**
|
||||
String get publishConflicts;
|
||||
|
||||
/// No description provided for @publishConflictsElsewhere.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Some cards, notes or steps were changed differently on two devices. Sync, then try again.'**
|
||||
String get publishConflictsElsewhere;
|
||||
|
||||
/// No description provided for @publishUntitled.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Untitled'**
|
||||
String get publishUntitled;
|
||||
|
||||
/// No description provided for @publishFilesMissing.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Some files haven\'t reached your instance yet. Try again in a moment.'**
|
||||
String get publishFilesMissing;
|
||||
|
||||
/// No description provided for @publishNothingChanged.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Nothing has changed since the last release.'**
|
||||
String get publishNothingChanged;
|
||||
|
||||
/// No description provided for @publishBusy.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This studyset is being published already. Try again in a moment.'**
|
||||
String get publishBusy;
|
||||
|
||||
/// No description provided for @publishSlugInvalid.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Lower-case letters, digits and hyphens, starting with a letter or digit.'**
|
||||
String get publishSlugInvalid;
|
||||
|
||||
/// No description provided for @publishSlugTaken.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Another of your studysets has this name.'**
|
||||
String get publishSlugTaken;
|
||||
|
||||
/// No description provided for @publishNotesTooLong.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'At most 5,000 characters.'**
|
||||
String get publishNotesTooLong;
|
||||
|
||||
/// No description provided for @publishDone.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Published v{version}.'**
|
||||
String publishDone(int version);
|
||||
|
||||
/// No description provided for @publishFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Couldn\'t reach your instance. Nothing was published.'**
|
||||
String get publishFailed;
|
||||
|
||||
/// No description provided for @publishUnreachable.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Publishing can\'t be reached right now.'**
|
||||
String get publishUnreachable;
|
||||
|
||||
/// No description provided for @publishRetry.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Retry'**
|
||||
String get publishRetry;
|
||||
|
||||
/// No description provided for @publishCopyLocation.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Copy address'**
|
||||
String get publishCopyLocation;
|
||||
|
||||
/// No description provided for @publishLocationCopied.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Address copied.'**
|
||||
String get publishLocationCopied;
|
||||
}
|
||||
|
||||
class _AppLocalizationsDelegate
|
||||
|
|
|
|||
Loading…
Reference in a new issue