# % Options Settings: https://orgmode.org/manual/Export-Settings.html
#+OPTIONS: timestamp:nil ^:nil <:nil p:t prop:t tags:t tasks:t todo:t
#+LATEX_CLASS: article
#+LaTeX_CLASS_OPTIONS: [a4paper,12pt]
#+LATEX_HEADER: \usepackage{booktabs}
# % to include pdf/eps/png files
#+LATEX_HEADER: \usepackage{indentfirst}
#+LATEX_HEADER: \usepackage{graphicx}
# % useful to add 'todo' markers
#+LaTeX_HEADER: \usepackage{todonotes}
#+LaTeX_HEADER: \setlength{\marginparwidth}{2cm} % fix todonotes warning
# % hyperrefs
#+LaTeX_HEADER: \usepackage{hyperref}
# % ----------------- Code blocks ----------------
# % Dependencies: pip install pygments
# % nice source code formatting
#+LaTeX_HEADER: \usepackage{xcolor}
#+LaTeX_HEADER: \definecolor{bg}{rgb}{0.98,0.98,0.98}
#+LaTeX_HEADER: \usepackage[cache=false]{minted}
#+LaTeX_HEADER: \setminted{
#+LaTeX_HEADER:   fontsize=\small,
#+LaTeX_HEADER:   baselinestretch=1,
#+LaTeX_HEADER:   xleftmargin=4em,
#+LaTeX_HEADER:   breaklines,
#+LaTeX_HEADER:   mathescape,
#+LaTeX_HEADER:   linenos,
#+LaTeX_HEADER:   numbersep=5pt,
#+LaTeX_HEADER:   frame=leftline,
#+LaTeX_HEADER:   framesep=2mm,
#+LaTeX_HEADER:   autogobble,
#+LaTeX_HEADER:   style=tango,
#+LaTeX_HEADER:   bgcolor=bg
#+LaTeX_HEADER: }
# % change style of section headings
#+LaTeX_HEADER: \usepackage{sectsty}
#+LaTeX_HEADER: \allsectionsfont{\sffamily}
# % only required for orgmode ticked TODO items, can remove
#+LaTeX_HEADER: \usepackage{amssymb}
# % only required for underlining text
#+LaTeX_HEADER: \usepackage[normalem]{ulem}
# % often use this in differential operators:
#+LaTeX_HEADER: \renewcommand{\d}{\ensuremath{\mathrm{d}}}
# % allow more reasonable text width for most documents than LaTeX default
#+LaTeX_HEADER: \setlength{\textheight}{21cm}
#+LaTeX_HEADER: \setlength{\textwidth}{16cm}
# % reduce left and right margins accordingly
#+LaTeX_HEADER: \setlength{\evensidemargin}{-0cm}
#+LaTeX_HEADER: \setlength{\oddsidemargin}{-0cm}
# % reduce top margin
#+LaTeX_HEADER: \setlength{\topmargin}{0cm}
# % references formats
#+LaTeX_HEADER: \usepackage[round]{natbib}
# % Chinese supported
#+LATEX_HEADER: \usepackage{ctex}
# % Increase default line spacing a little
#+LATEX_HEADER: \usepackage{setspace}
#+LATEX_HEADER: \renewcommand{\baselinestretch}{1.5}
#+LATEX_HEADER: \setlength{\parskip}{0.8em}
# % Line & paragraph space end
# % item list margin
#+LATEX_HEADER: \usepackage{enumitem}
# % Breaking Page Between Title and Toc
#+LATEX_HEADER: \makeatletter \def\@maketitle{\null \begin{center} {\vskip 5em \Huge \@title} \vskip 30em {\LARGE \@author} \vskip 3em {\LARGE \@date} \end{center} \newpage} \makeatother
# % End of Breaking Page Between Title and Toc
#+LATEX_HEADER: \renewcommand\contentsname{目录}
# Generate Tex File: C-c C-e l l; then replace verbatim with minted, and must special the code language
#+LATEX_HEADER: % Generate PDF: xelatex -shell-escape <tex file>
#+AUTHOR: jouyouyun
#+EMAIL: yanbowen717@gmail.com
#+TITLE: deepin repo manager

#+latex: \newpage
** Remote Repo
此为基础系统的远程 repo ，管理基础系统的发布和更新，基于 ostree 构建，支持全量更新和增量更新。

*** Repo 构建
#+begin_src shell
ostree init --repo=base-os
ostree commit --repo=base-os --branch=<version> -s "subject" os-data
#+end_src

*** 版本发布
#+begin_src shell
ostree checkout --repo=base-os <version> <data dir>
ostree diff --repo=repo <prev_version> <data dir> > <version diff file>
# 创建此次更新的描述文件 base_<version>.xml

mksquashfs <data dir> base_<version>.sqsh -comp zstd
mksign base_<version>.sqsh <version diff file> base_<version>.xml -o manifest.xml # 生成签名信息
# 使用 zstd 将 .sqsh .xml 文件压缩成单个文件进行发布
#+end_src

*** 版本更新
#+begin_src shell
ostree checkout --repo=base-os <last version> <data dir>
# merge <update data> to <data dir>
ostree commit --repo=base-os --branch=<new version> -s "subject" <data dir>
# 更新中需包含描述信息
#+end_src

*** 更新生成
此是根据终端的更新请求生成的更新文件，请求中需要包含请求模式和当前版本：
+ mode：full、incremental
+ version：终端 last version

**** 全量更新
生成 remote repo last version 文件，包含描述信息、签名信息等，文件格式与版本发布的格式相同。

**** 增量更新
基于终端传入的版本，生成与 remote repo last version 之间的增量更新文件：
#+begin_src shell
ostree checkout --repo=base-os <version> <data dir>
ostree diff --repo=repo <ending version> <data dir> > <version diff file>
# 根据 diff 文件生成增量数据
# 如果更新中涉及原有文件或目录的删除，则需要将原有文件或目录创建为同名的字符文件(mknod <filepath> c 1 0)
#
# 描述文件为 remote repo last version 的描述文件
mksquashfs <data dir> base_<version>.sqsh -comp zstd
mksign base_<version>.sqsh <version diff file> base_<version>.xml -o manifest.xml # 生成签名信息
# 使用 zstd 将 .sqsh .xml 文件压缩成单个文件进行发布
#+end_src

** Local Repo
此 repo 为终端安装时初始化生成的，数据来源与 remote repo 。终端差异化的文件都不在此 repo 中，如 fstab、grub.cfg、nvidia driver 等。

这些差异化文件都在当前系统合成时生成。

更新时，获取终端 repo 的 last version ，然后调用 remote repo 的接口，获取更新内容，默认采用增量更新模式。
