import re
import string
import tarfile
+import unicodedata
from .constants import *
"""
return "".join([random.choice(random_chars) for i in range(length)])
+def infinity():
+ i = 0
+
+ while True:
+ i += 1
+ yield i
+
+def normalize(*args, iteration=1):
+ s = "-".join((e for e in args if e))
+
+ # Append iteration when larger than one
+ if iteration > 1:
+ s += "-%s" % iteration
+
+ # Remove any non-ASCII characters
+ try:
+ s = unicodedata.normalize("NFKD", s)
+ except TypeError:
+ pass
+
+ # Encode into ASCII and back again
+ s = s.encode("ascii", errors="ignore").decode()
+
+ # Remove excessive whitespace
+ s = re.sub(r"[^\w]+", " ", s)
+
+ return "-".join(s.split())
+
def format_size(s):
units = ("B", "k", "M", "G", "T")
from . import base
from . import logs
+from . import misc
from .constants import *
from .decorators import *
return iter(repositories)
- def create(self, distro, name, description):
- return self._get_repository("INSERT INTO repositories(distro_id, name, description) \
- VALUES(%s, %s, %s) RETURNING *", distro.id, name, description)
+ def create(self, distro, name, owner=None):
+ """
+ Creates a new repository
+ """
+ # Generate a slug
+ slug = self._make_slug(name, owner=owner)
+
+ return self._get_repository("""
+ INSERT INTO
+ repositories
+ (
+ distro_id,
+ owner_id,
+ name,
+ slug
+ )
+ VALUES
+ (
+ %s,
+ %s,
+ %s,
+ %s
+ )
+ RETURNING *""",
+ distro,
+ owner,
+ name,
+ slug,
+ )
+
+ def _make_slug(self, name, owner=None):
+ for i in misc.infinity():
+ slug = misc.normalize(name)
+
+ exists = self.db.get("SELECT 1 FROM repositories \
+ WHERE deleted IS FALSE AND owner_id = %s AND slug = %s", owner, slug)
+ if not exists:
+ return slug
def get_by_id(self, repo_id):
return self._get_repository("SELECT * FROM repositories \
priority = property(lambda s: s.data.priority, set_priority)
- def get_user(self):
- if self.data.user_id:
- return self.backend.users.get_by_id(self.data.user_id)
+ # Owner
- def set_user(self, user):
- self._set_attribute("user_id", user.id)
+ def get_owner(self):
+ if self.data.owner_id:
+ return self.backend.users.get_by_id(self.data.owner_id)
- user = property(get_user, set_user)
+ def set_owner(self, owner):
+ self._set_attribute("owner_id", owner)
+
+ owner = property(get_owner, set_owner)
@property
def info(self):
"arches" : self.arches,
}
- @property
- def basepath(self):
- return os.path.join(
- self.distro.identifier,
- self.identifier,
+ @lazy_property
+ def path(self):
+ parts = []
+
+ # Add owner
+ if self.owner:
+ parts.append("~%s" % self.owner.name)
+
+ # Add distro & slug
+ parts += (
+ self.distro.sname,
+ self.slug,
)
- @property
- def path(self):
- return os.path.join(REPOS_DIR, self.basepath)
+ # Join everything together
+ return os.path.join(*parts)
@property
def url(self):
return "/".join((
self.settings.get("baseurl", "https://pakfire.ipfire.org"),
"repositories",
- self.basepath,
+ self.path,
))
@property
def mirrorlist(self):
return "/".join((
self.settings.get("baseurl", "https://pakfire.ipfire.org"),
- "distro", self.distro.identifier,
- "repo", self.identifier,
+ "distro", self.distro.sname,
+ "repo", self.slug,
"mirrorlist?arch=%{arch}"
))
def name(self):
return self.data.name
- @property
- def identifier(self):
- return self.name.lower()
-
- @property
- def type(self):
- return self.data.type
-
@property
def summary(self):
lines = self.description.splitlines()
return self.backend.sessions._get_sessions("SELECT * FROM sessions \
WHERE user_id = %s AND valid_until >= NOW() ORDER BY created_at")
+ # Custom repositories
+
+ @property
+ def repos(self):
+ """
+ Returns all custom repositories
+ """
+ repos = self.backend.repositories._get_repos("""
+ SELECT
+ *
+ FROM
+ repositories
+ WHERE
+ deleted IS FALSE
+ AND
+ owner_id = %s
+ ORDER BY
+ name""",
+ self.id,
+ )
+
+ return list(repos)
+
class UserEmail(base.DataObject):
table = "users_emails"
CREATE TABLE public.repositories (
id integer NOT NULL,
name text NOT NULL,
- type text DEFAULT 'testing'::text NOT NULL,
+ slug text,
description text NOT NULL,
distro_id integer NOT NULL,
parent_id integer,
time_max integer DEFAULT 0 NOT NULL,
deleted boolean DEFAULT false NOT NULL,
priority integer,
- user_id integer,
- update_forced boolean DEFAULT false NOT NULL
+ owner_id integer,
+ update_forced boolean DEFAULT false NOT NULL,
+ created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+ listed boolean DEFAULT true NOT NULL
);
ADD CONSTRAINT idx_2198155_primary PRIMARY KEY (id);
---
--- Name: repositories idx_2198164_primary; Type: CONSTRAINT; Schema: public; Owner: pakfire
---
-
-ALTER TABLE ONLY public.repositories
- ADD CONSTRAINT idx_2198164_primary PRIMARY KEY (id);
-
-
--
-- Name: repositories_aux idx_2198179_primary; Type: CONSTRAINT; Schema: public; Owner: pakfire
--
ADD CONSTRAINT repositories_builds_unique UNIQUE (repo_id, build_id);
+--
+-- Name: repositories repositories_pkey; Type: CONSTRAINT; Schema: public; Owner: pakfire
+--
+
+ALTER TABLE ONLY public.repositories
+ ADD CONSTRAINT repositories_pkey PRIMARY KEY (id);
+
+
--
-- Name: sessions sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: pakfire
--
CREATE INDEX repositories_builds_repo_id ON public.repositories_builds USING btree (repo_id);
+--
+-- Name: repositories_unique; Type: INDEX; Schema: public; Owner: pakfire
+--
+
+CREATE UNIQUE INDEX repositories_unique ON public.repositories USING btree (owner_id, distro_id, name) WHERE (deleted IS FALSE);
+
+
--
-- Name: uploads_uuid; Type: INDEX; Schema: public; Owner: pakfire
--
--
--- Name: repositories repositories_parent_id; Type: FK CONSTRAINT; Schema: public; Owner: pakfire
+-- Name: repositories repositories_owner_id; Type: FK CONSTRAINT; Schema: public; Owner: pakfire
--
ALTER TABLE ONLY public.repositories
- ADD CONSTRAINT repositories_parent_id FOREIGN KEY (parent_id) REFERENCES public.repositories(id);
+ ADD CONSTRAINT repositories_owner_id FOREIGN KEY (owner_id) REFERENCES public.users(id);
--
--- Name: repositories repositories_user_id; Type: FK CONSTRAINT; Schema: public; Owner: pakfire
+-- Name: repositories repositories_parent_id; Type: FK CONSTRAINT; Schema: public; Owner: pakfire
--
ALTER TABLE ONLY public.repositories
- ADD CONSTRAINT repositories_user_id FOREIGN KEY (user_id) REFERENCES public.users(id);
+ ADD CONSTRAINT repositories_parent_id FOREIGN KEY (parent_id) REFERENCES public.repositories(id);
--