From 6ec4a3589e327ded693ab0c741828fc5ec66b840 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Sun, 21 Feb 2016 19:44:38 +0100 Subject: Send notifications when changing ownership Add a new option that makes it possible to subscribe to package ownership changes (adoption/disownment). Fixes FS#15412. Signed-off-by: Lukas Fleischer --- scripts/notify.py | 44 ++++++++++++++++++++++++++++++++++++++ upgrading/4.3.0.txt | 5 +++++ web/lib/acctfuncs.inc.php | 7 ++++-- web/lib/pkgbasefuncs.inc.php | 8 ++++++- web/template/account_edit_form.php | 4 ++++ 5 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 upgrading/4.3.0.txt diff --git a/scripts/notify.py b/scripts/notify.py index 25102a2..5e5f377 100755 --- a/scripts/notify.py +++ b/scripts/notify.py @@ -115,6 +115,16 @@ def get_update_recipients(cur, pkgbase_id, uid): return [row[0] for row in cur.fetchall()] +def get_ownership_recipients(cur, pkgbase_id, uid): + cur.execute('SELECT DISTINCT Users.Email FROM Users ' + + 'INNER JOIN PackageNotifications ' + + 'ON PackageNotifications.UserID = Users.ID WHERE ' + + 'Users.OwnershipNotify = 1 AND ' + + 'PackageNotifications.UserID != %s AND ' + + 'PackageNotifications.PackageBaseID = %s', [uid, pkgbase_id]) + return [row[0] for row in cur.fetchall()] + + def get_request_recipients(cur, reqid): cur.execute('SELECT DISTINCT Users.Email FROM PackageRequests ' + 'INNER JOIN PackageBases ' + @@ -243,6 +253,38 @@ def flag(cur, uid, pkgbase_id): send_notification(to, subject, body, refs) +def adopt(cur, pkgbase_id, uid): + user = username_from_id(cur, uid) + pkgbase = pkgbase_from_id(cur, pkgbase_id) + to = get_ownership_recipients(cur, pkgbase_id, uid) + + user_uri = aur_location + '/account/' + user + '/' + pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' + + subject = 'AUR Ownership Notification for %s' % (pkgbase) + body = 'The package %s [1] was adopted by %s [2].' % (pkgbase, user) + refs = '[1] ' + pkgbase_uri + '\n' + refs += '[2] ' + user_uri + + send_notification(to, subject, body, refs) + + +def disown(cur, pkgbase_id, uid): + user = username_from_id(cur, uid) + pkgbase = pkgbase_from_id(cur, pkgbase_id) + to = get_ownership_recipients(cur, pkgbase_id, uid) + + user_uri = aur_location + '/account/' + user + '/' + pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/' + + subject = 'AUR Ownership Notification for %s' % (pkgbase) + body = 'The package %s [1] was disowned by %s [2].' % (pkgbase, user) + refs = '[1] ' + pkgbase_uri + '\n' + refs += '[2] ' + user_uri + + send_notification(to, subject, body, refs) + + def comaintainer_add(cur, pkgbase_id, uid): pkgbase = pkgbase_from_id(cur, pkgbase_id) to = [get_user_email(cur, uid)] @@ -364,6 +406,8 @@ if __name__ == '__main__': 'comment': comment, 'update': update, 'flag': flag, + 'adopt': adopt, + 'disown': disown, 'comaintainer-add': comaintainer_add, 'comaintainer-remove': comaintainer_remove, 'delete': delete, diff --git a/upgrading/4.3.0.txt b/upgrading/4.3.0.txt new file mode 100644 index 0000000..0d3a9b7 --- /dev/null +++ b/upgrading/4.3.0.txt @@ -0,0 +1,5 @@ +1. Add a column to store ownership notification settings: + +---- +ALTER TABLE Users ADD COLUMN OwnershipNotify TINYINT(1) NOT NULL DEFAULT 1; +---- diff --git a/web/lib/acctfuncs.inc.php b/web/lib/acctfuncs.inc.php index b39420f..be0981f 100644 --- a/web/lib/acctfuncs.inc.php +++ b/web/lib/acctfuncs.inc.php @@ -58,13 +58,14 @@ function html_format_pgp_fingerprint($fingerprint) { * @param string $J The inactivity status of the displayed user * @param string $CN Whether to notify of new comments * @param string $UN Whether to notify of package updates + * @param string $ON Whether to notify of ownership changes * @param string $UID The user ID of the displayed user * @param string $N The username as present in the database * * @return void */ function display_account_form($A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",$R="", - $L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$UID=0,$N="") { + $L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$ON="",$UID=0,$N="") { global $SUPPORTED_LANGS; include("account_edit_form.php"); @@ -92,13 +93,14 @@ function display_account_form($A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",$R="" * @param string $J The inactivity status of the user * @param string $CN Whether to notify of new comments * @param string $UN Whether to notify of package updates + * @param string $ON Whether to notify of ownership changes * @param string $UID The user ID of the modified account * @param string $N The username as present in the database * * @return array Boolean indicating success and message to be printed */ function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C="", - $R="",$L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$UID=0,$N="") { + $R="",$L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$ON="",$UID=0,$N="") { global $SUPPORTED_LANGS; $error = ''; @@ -347,6 +349,7 @@ function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C="" $q.= ", InactivityTS = " . $inactivity_ts; $q.= ", CommentNotify = " . ($CN ? "1" : "0"); $q.= ", UpdateNotify = " . ($UN ? "1" : "0"); + $q.= ", OwnershipNotify = " . ($ON ? "1" : "0"); $q.= " WHERE ID = ".intval($UID); $result = $dbh->exec($q); diff --git a/web/lib/pkgbasefuncs.inc.php b/web/lib/pkgbasefuncs.inc.php index 1691bff..5d10cce 100644 --- a/web/lib/pkgbasefuncs.inc.php +++ b/web/lib/pkgbasefuncs.inc.php @@ -661,6 +661,9 @@ function pkgbase_adopt ($base_ids, $action=true, $via) { $q.= "SET MaintainerUID = $uid "; $q.= "WHERE ID IN (" . implode(",", $base_ids) . ") "; $dbh->exec($q); + + /* Add the new maintainer to the notification list. */ + pkgbase_notify($base_ids); } else { /* Update the co-maintainer list when disowning a package. */ if (has_credential(CRED_PKGBASE_DISOWN)) { @@ -692,8 +695,11 @@ function pkgbase_adopt ($base_ids, $action=true, $via) { } } + foreach ($base_ids as $base_id) { + notify(array($action ? 'adopt' : 'disown', $base_id, $uid)); + } + if ($action) { - pkgbase_notify($base_ids); return array(true, __("The selected packages have been adopted.")); } else { return array(true, __("The selected packages have been disowned.")); diff --git a/web/template/account_edit_form.php b/web/template/account_edit_form.php index b9affd6..b4f0192 100644 --- a/web/template/account_edit_form.php +++ b/web/template/account_edit_form.php @@ -143,6 +143,10 @@ />

+

+ + /> +

-- cgit v1.2.3 From 7b13203b817084717a46e2f671e3cb533fdb1092 Mon Sep 17 00:00:00 2001 From: Eric Engestrom Date: Sat, 12 Mar 2016 14:50:03 +0000 Subject: Limit comment height to 15 lines Signed-off-by: Eric Engestrom Signed-off-by: Lukas Fleischer --- web/html/css/aurweb.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/web/html/css/aurweb.css b/web/html/css/aurweb.css index f5e1037..f777ab8 100644 --- a/web/html/css/aurweb.css +++ b/web/html/css/aurweb.css @@ -148,3 +148,8 @@ label.confirmation, color: red; font-weight: bold; } + +#news div p { + max-height: 15em; + overflow: auto; +} -- cgit v1.2.3 From 2dfa72131bfbc96584b78b597f86471874108a89 Mon Sep 17 00:00:00 2001 From: "Ian D. Scott" Date: Sat, 12 Mar 2016 13:49:46 -0800 Subject: Remove code referencing non-existent and unused file Signed-off-by: Lukas Fleischer --- web/html/index.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/web/html/index.php b/web/html/index.php index 3787d4e..78ab6ad 100644 --- a/web/html/index.php +++ b/web/html/index.php @@ -167,10 +167,6 @@ if (!empty($tokens[1]) && '/' . $tokens[1] == get_pkg_route()) { header("Content-Type: image/gif"); readfile("./$path"); break; - case "/css/archnavbar/archlogo.gif": - header("Content-Type: image/png"); - readfile("./$path"); - break; case "/css/archnavbar/archlogo.png": case "/css/archnavbar/aurlogo.png": case "/images/favicon.ico": -- cgit v1.2.3 From ff36b231535e7dae67878779341b7e52137b8102 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 15 Mar 2016 17:56:43 +0100 Subject: Fix instructions for omitting "have" lines In 002d348 (Describe how to omit "have" lines, 2015-11-14), we added instructions on how to omit "have" lines originating from other package repositories. Fix those instructions such that the HEAD ref of the repository is transferred properly. Signed-off-by: Lukas Fleischer --- INSTALL | 3 ++- doc/git-interface.txt | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/INSTALL b/INSTALL index be39052..8b0cd29 100644 --- a/INSTALL +++ b/INSTALL @@ -47,7 +47,8 @@ Setup on Arch Linux # cd /srv/http/aurweb/aur.git/ # git init --bare # git config --local transfer.hideRefs '^refs/' - # git config --local transfer.hideRefs '!refs/' + # git config --local --add transfer.hideRefs '!refs/' + # git config --local --add transfer.hideRefs '!HEAD' # ln -s ../../git-interface/git-update.py hooks/update # chown -R aur . diff --git a/doc/git-interface.txt b/doc/git-interface.txt index 4a24eef..69c558b 100644 --- a/doc/git-interface.txt +++ b/doc/git-interface.txt @@ -89,7 +89,7 @@ so-called "have" lines. This is normally used to reduce traffic but it has the opposite effect in the case of aurweb: Many essentially useless lines are transferred to the Git client during `git push` operations. -In order to omit these advertisements, add the strings "^refs/" and "!refs/" to -the transfer.hideRefs configuration setting. Note that the order of these -patterns is important ("^refs/" must come first) and that Git 2.7 or newer is -required for them to work. +In order to omit these advertisements, add the strings "^refs/", "!refs/" and +"!HEAD" to the transfer.hideRefs configuration setting. Note that the order of +these patterns is important ("^refs/" must come first) and that Git 2.7 or +newer is required for them to work. -- cgit v1.2.3 From 0108c64541d2cd9684ce0b75acfc541bf479ae71 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 15 Mar 2016 18:01:15 +0100 Subject: Resize the LastLoginIPAddress column Make sure that all valid IPv6 addresses fit into the LastLoginIPAddress field. Signed-off-by: Lukas Fleischer --- schema/aur-schema.sql | 2 +- upgrading/4.3.0.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/schema/aur-schema.sql b/schema/aur-schema.sql index aa5ed9d..0804ac3 100644 --- a/schema/aur-schema.sql +++ b/schema/aur-schema.sql @@ -35,7 +35,7 @@ CREATE TABLE Users ( IRCNick VARCHAR(32) NOT NULL DEFAULT '', PGPKey VARCHAR(40) NULL DEFAULT NULL, LastLogin BIGINT UNSIGNED NOT NULL DEFAULT 0, - LastLoginIPAddress VARCHAR(40) NULL DEFAULT NULL, + LastLoginIPAddress VARCHAR(45) NULL DEFAULT NULL, InactivityTS BIGINT UNSIGNED NOT NULL DEFAULT 0, RegistrationTS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, CommentNotify TINYINT(1) NOT NULL DEFAULT 1, diff --git a/upgrading/4.3.0.txt b/upgrading/4.3.0.txt index 0d3a9b7..34b19a2 100644 --- a/upgrading/4.3.0.txt +++ b/upgrading/4.3.0.txt @@ -3,3 +3,9 @@ ---- ALTER TABLE Users ADD COLUMN OwnershipNotify TINYINT(1) NOT NULL DEFAULT 1; ---- + +2. Resize the LastLoginIPAddress column: + +---- +ALTER TABLE Users MODIFY LastLoginIPAddress VARCHAR(45) NULL DEFAULT NULL; +---- -- cgit v1.2.3 From 2ef5f8a5ff23ee0b45a67f1d2ca3f646f09c2ff5 Mon Sep 17 00:00:00 2001 From: Mark Weiman Date: Thu, 17 Mar 2016 15:58:14 -0400 Subject: Change text of enable notifications link Since notifications are sent for more than just comments, change the notify link to more generic text. Signed-off-by: Mark Weiman Signed-off-by: Lukas Fleischer --- web/template/pkgbase_actions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/template/pkgbase_actions.php b/web/template/pkgbase_actions.php index 237e712..d3f0592 100644 --- a/web/template/pkgbase_actions.php +++ b/web/template/pkgbase_actions.php @@ -24,7 +24,7 @@
  • -
  • +
  • -- cgit v1.2.3 From b2e97cdd1ee804468b2dd601eafda9574c05a3a7 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 17 May 2016 19:03:39 +0200 Subject: Add repository information to official providers When updating the list of packages provided by the official repositories, also save the repository names. --- schema/aur-schema.sql | 1 + scripts/aurblup.py | 8 ++++++-- upgrading/4.3.0.txt | 6 ++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/schema/aur-schema.sql b/schema/aur-schema.sql index 0804ac3..ea19d46 100644 --- a/schema/aur-schema.sql +++ b/schema/aur-schema.sql @@ -310,6 +310,7 @@ CREATE TABLE PackageBlacklist ( CREATE TABLE OfficialProviders ( ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Name VARCHAR(64) NOT NULL, + Repo VARCHAR(64) NOT NULL, Provides VARCHAR(64) NOT NULL, PRIMARY KEY (ID) ) ENGINE = InnoDB; diff --git a/scripts/aurblup.py b/scripts/aurblup.py index 325ef3d..9e11e43 100755 --- a/scripts/aurblup.py +++ b/scripts/aurblup.py @@ -20,6 +20,7 @@ servers = config.get('aurblup', 'servers').split(' ') blacklist = set() providers = set() +repomap = dict() h = pyalpm.Handle("/", db_path) for sync_db in sync_dbs: @@ -33,9 +34,11 @@ for sync_db in sync_dbs: blacklist.add(pkg.name) [blacklist.add(x) for x in pkg.replaces] providers.add((pkg.name, pkg.name)) + repomap[(pkg.name, pkg.name)] = repo.name for provision in pkg.provides: provisionname = re.sub(r'(<|=|>).*', '', provision) providers.add((pkg.name, provisionname)) + repomap[(pkg.name, provisionname)] = repo.name db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, passwd=aur_db_pass, db=aur_db_name, @@ -54,8 +57,9 @@ cur.execute("SELECT Name, Provides FROM OfficialProviders") oldproviders = set(cur.fetchall()) for pkg, provides in providers.difference(oldproviders): - cur.execute("INSERT INTO OfficialProviders (Name, Provides) " - "VALUES (%s, %s)", [pkg, provides]) + repo = repomap[(pkg, provides)] + cur.execute("INSERT INTO OfficialProviders (Name, Repo, Provides) " + "VALUES (%s, %s, %s)", [pkg, repo, provides]) for pkg, provides in oldproviders.difference(providers): cur.execute("DELETE FROM OfficialProviders " "WHERE Name = %s AND Provides = %s", [pkg, provides]) diff --git a/upgrading/4.3.0.txt b/upgrading/4.3.0.txt index 34b19a2..f7f3e08 100644 --- a/upgrading/4.3.0.txt +++ b/upgrading/4.3.0.txt @@ -9,3 +9,9 @@ ALTER TABLE Users ADD COLUMN OwnershipNotify TINYINT(1) NOT NULL DEFAULT 1; ---- ALTER TABLE Users MODIFY LastLoginIPAddress VARCHAR(45) NULL DEFAULT NULL; ---- + +3. Add a new column to store repository information of official providers: + +---- +ALTER TABLE OfficialProviders ADD COLUMN Repo VARCHAR(64) NOT NULL; +---- -- cgit v1.2.3 From d273ee5eb20ecb6e97d5d6cd8a1f493e3652b584 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 17 May 2016 19:07:41 +0200 Subject: Use the official provider list to detect duplicates Instead of automatically adding packages from the official binary repositories to the package blacklist, use the official provider list to prevent users from uploading duplicates. This does not only result in reduced disk usage but also has a nice visible side effect. The error messages printed by the update hook now look like error: package already provided by [community]: powerline-fonts instead of error: package is blacklisted: powerline-fonts which was confusing to most end users. Signed-off-by: Lukas Fleischer --- git-interface/git-update.py | 6 ++++++ scripts/aurblup.py | 8 -------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/git-interface/git-update.py b/git-interface/git-update.py index e54e0e6..2c24e72 100755 --- a/git-interface/git-update.py +++ b/git-interface/git-update.py @@ -331,12 +331,18 @@ pkgbase_id = cur.fetchone()[0] if cur.rowcount == 1 else 0 cur.execute("SELECT Name FROM PackageBlacklist") blacklist = [row[0] for row in cur.fetchall()] +cur.execute("SELECT Name, Repo FROM OfficialProviders") +providers = dict(cur.fetchall()) + for pkgname in srcinfo.utils.get_package_names(metadata): pkginfo = srcinfo.utils.get_merged_package(pkgname, metadata) pkgname = pkginfo['pkgname'] if pkgname in blacklist and not privileged: die('package is blacklisted: {:s}'.format(pkgname)) + if pkgname in providers and not privileged: + repo = providers[pkgname] + die('package already provided by [{:s}]: {:s}'.format(repo, pkgname)) cur.execute("SELECT COUNT(*) FROM Packages WHERE Name = %s AND " + "PackageBaseID <> %s", [pkgname, pkgbase_id]) diff --git a/scripts/aurblup.py b/scripts/aurblup.py index 9e11e43..6733b45 100755 --- a/scripts/aurblup.py +++ b/scripts/aurblup.py @@ -45,14 +45,6 @@ db = mysql.connector.connect(host=aur_db_host, user=aur_db_user, unix_socket=aur_db_socket, buffered=True) cur = db.cursor() -cur.execute("SELECT Name FROM PackageBlacklist") -oldblacklist = set([row[0] for row in cur.fetchall()]) - -for pkg in blacklist.difference(oldblacklist): - cur.execute("INSERT INTO PackageBlacklist (Name) VALUES (%s)", [pkg]) -for pkg in oldblacklist.difference(blacklist): - cur.execute("DELETE FROM PackageBlacklist WHERE Name = %s", [pkg]) - cur.execute("SELECT Name, Provides FROM OfficialProviders") oldproviders = set(cur.fetchall()) -- cgit v1.2.3 From e17e88a2e20531914cda220543c55d991b99721c Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Mon, 23 May 2016 22:53:12 +0200 Subject: Add request type hints Add a text that explains when the currently selected request type should be used. Signed-off-by: Lukas Fleischer --- web/template/pkgreq_form.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/web/template/pkgreq_form.php b/web/template/pkgreq_form.php index 4fd7851..639326e 100644 --- a/web/template/pkgreq_form.php +++ b/web/template/pkgreq_form.php @@ -16,7 +16,7 @@

    - @@ -35,8 +35,16 @@ } } + function showHideRequestHints() { + $('#deletion_hint').hide(); + $('#merge_hint').hide(); + $('#orphan_hint').hide(); + $('#' + $('#id_type').val() + '_hint').show(); + } + $(document).ready(function() { showHideMergeSection(); + showHideRequestHints(); $('#id_merge_into').typeahead({ source: function(query, callback) { @@ -59,6 +67,15 @@

    +

    + +

    +

    + +

    +

    + +

    " />

    -- cgit v1.2.3 From b757246e33a8cfcb5b8973d659a0b513d3b767d7 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Thu, 2 Jun 2016 08:37:43 +0200 Subject: pkgbasefuncs.inc.php: Remove debug statement Remove a leftover var_dump() invocation that was introduced in commit 5fb7a74 (Replace categories with keywords, 2015-06-13). Signed-off-by: Lukas Fleischer --- web/lib/pkgbasefuncs.inc.php | 1 - 1 file changed, 1 deletion(-) diff --git a/web/lib/pkgbasefuncs.inc.php b/web/lib/pkgbasefuncs.inc.php index 5d10cce..b082784 100644 --- a/web/lib/pkgbasefuncs.inc.php +++ b/web/lib/pkgbasefuncs.inc.php @@ -1062,7 +1062,6 @@ function pkgbase_set_keywords($base_id, $keywords) { $i = 0; foreach ($keywords as $keyword) { $q = sprintf("INSERT INTO PackageKeywords (PackageBaseID, Keyword) VALUES (%d, %s)", $base_id, $dbh->quote($keyword)); - var_dump($q); $dbh->exec($q); $i++; -- cgit v1.2.3 From 333596ab4aca12bd9444196066f1511f07650f3f Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Wed, 8 Jun 2016 22:02:03 +0200 Subject: Update Arch Linux projects subdomain The projects.archlinux.org subdomain was moved to git.archlinux.org. Signed-off-by: Lukas Fleischer --- INSTALL | 2 +- README | 2 +- doc/i18n.txt | 2 +- web/template/footer.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/INSTALL b/INSTALL index 8b0cd29..dab48cc 100644 --- a/INSTALL +++ b/INSTALL @@ -4,7 +4,7 @@ Setup on Arch Linux 1) Clone the AUR project: $ cd /srv/http/ - $ git clone git://projects.archlinux.org/aurweb.git + $ git clone git://git.archlinux.org/aurweb.git 2) Setup a web server with PHP and MySQL. Configure the web server to redirect all URLs to /index.php/foo/bar/. The following block can be used with nginx: diff --git a/README b/README index 71e8481..1988186 100644 --- a/README +++ b/README @@ -42,7 +42,7 @@ web:: Links ----- -* The repository is hosted at git://projects.archlinux.org/aurweb.git -- see +* The repository is hosted at git://git.archlinux.org/aurweb.git -- see doc/CodingGuidelines for information on submitting patches. * Discovered bugs can be submitted to the aurweb bug tracker: diff --git a/doc/i18n.txt b/doc/i18n.txt index d5b6764..a1c21fe 100644 --- a/doc/i18n.txt +++ b/doc/i18n.txt @@ -21,7 +21,7 @@ strings for the translation to be usable, and it may have to be disabled. 1. Check out the aurweb source using git: -$ git clone git://projects.archlinux.org/aurweb.git aurweb-git +$ git clone git://git.archlinux.org/aurweb.git aurweb-git 2. Go into the "po/" directory in the aurweb source and run msginit(1) to create a initial translation file from our translation catalog: diff --git a/web/template/footer.php b/web/template/footer.php index f5dc2d0..572dbb2 100644 --- a/web/template/footer.php +++ b/web/template/footer.php @@ -3,7 +3,7 @@