openSUSE Commits
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
October 2023
- 1 participants
- 2656 discussions
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-cligj for openSUSE:Factory checked in at 2022-04-28 23:07:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-cligj (Old)
and /work/SRC/openSUSE:Factory/.python-cligj.new.1538 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-cligj"
Thu Apr 28 23:07:52 2022 rev:2 rq:973538 version:0.7.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-cligj/python-cligj.changes 2019-03-10 09:36:21.436162133 +0100
+++ /work/SRC/openSUSE:Factory/.python-cligj.new.1538/python-cligj.changes 2022-04-28 23:07:56.736686031 +0200
@@ -1,0 +2,17 @@
+Mon Apr 25 13:47:41 UTC 2022 - Stefan Br��ns <stefan.bruens(a)rwth-aachen.de>
+
+- Update to 0.7.2:
+ * Permit use with click versions 8 and higher.
+- Update to 0.7.1:
+ * Future deprecation warning added in 0.7.0 has been changed.
+ Cligj version 1.0.0 will support Python versions >= 3.6.
+- Update to 0.7.0:
+ * Warn about deprecation of support for Python versions < 3.7
+ in 1.0.0 (#33).
+ * Warn about future change in --sequence default when the option
+ is used (#31).
+- Update to 0.6.0:
+ * Always use `encoding='utf-8'` when opening input GeoJSON (#27).
+ * Improve docstrings (#22).
+
+-------------------------------------------------------------------
Old:
----
cligj-0.5.0.tar.gz
New:
----
cligj-0.7.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-cligj.spec ++++++
--- /var/tmp/diff_new_pack.nCHSqc/_old 2022-04-28 23:07:57.216686554 +0200
+++ /var/tmp/diff_new_pack.nCHSqc/_new 2022-04-28 23:07:57.220686558 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-cligj
#
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2022 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -13,15 +13,16 @@
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
+#
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-cligj
-Version: 0.5.0
+Version: 0.7.2
Release: 0
License: BSD-3-Clause
Summary: Click params for commmand line interfaces to GeoJSON
-Url: https://github.com/mapbox/cligj
+URL: https://github.com/mapbox/cligj
Group: Development/Languages/Python
# pypi source lack license and tests
Source: https://github.com/mapbox/cligj/archive/%{version}.tar.gz#/cligj-%{version}…
@@ -35,7 +36,6 @@
Requires: python-click
BuildArch: noarch
-
%python_subpackages
%description
++++++ cligj-0.5.0.tar.gz -> cligj-0.7.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cligj-0.5.0/.travis.yml new/cligj-0.7.2/.travis.yml
--- old/cligj-0.5.0/.travis.yml 2018-09-26 17:58:55.000000000 +0200
+++ new/cligj-0.7.2/.travis.yml 2021-05-28 23:21:08.000000000 +0200
@@ -1,10 +1,9 @@
sudo: false
language: python
python:
- - "2.7"
- - "3.3"
- - "3.4"
- - "3.5"
+ - "3.6"
+ - "3.7"
+ - "3.8"
install:
- "pip install coveralls"
- "pip install -e .[test]"
@@ -17,4 +16,4 @@
tags: true
provider: pypi
distributions: "sdist bdist_wheel"
- user: mapboxci
+ user: __token__
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cligj-0.5.0/CHANGES.txt new/cligj-0.7.2/CHANGES.txt
--- old/cligj-0.5.0/CHANGES.txt 2018-09-26 17:58:55.000000000 +0200
+++ new/cligj-0.7.2/CHANGES.txt 2021-05-28 23:21:08.000000000 +0200
@@ -1,6 +1,36 @@
Changes
=======
+0.7.1 (2010-11-20)
+------------------
+
+- Future deprecation warning added in 0.7.0 has been changed. Cligj version
+ 1.0.0 will support Python versions >= 3.6.
+
+0.7.0 (2010-10-21)
+------------------
+
+- Warn about deprecation of support for Python versions < 3.7 in 1.0.0 (#33).
+- Warn about future change in --sequence default when the option is used (#31).
+
+0.6.0 (2020-10-19)
+------------------
+
+No changes since 0.6b1.
+
+0.6b1 (2020-10-14)
+------------------
+
+Future changes:
+
+- Feature sequences, not collections, will be the default form of output in
+ version 1.0 (#20).
+
+Bug fixes:
+
+- Always use `encoding='utf-8'` when opening input GeoJSON (#27).
+- Improve docstrings (#22).
+
0.5.0 (2018-09-26)
------------------
@@ -20,7 +50,7 @@
0.3.0 (2015-08-12)
------------------
-- Deprecation of the cligj.plugins module (#6). Please switch to the
+- Deprecation of the cligj.plugins module (#6). Please switch to the
click-plugins module: https://github.com/click-contrib/click-plugins. The
cligj.plugins module will be removed from cligj at version 1.0.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cligj-0.5.0/MANIFEST.in new/cligj-0.7.2/MANIFEST.in
--- old/cligj-0.5.0/MANIFEST.in 1970-01-01 01:00:00.000000000 +0100
+++ new/cligj-0.7.2/MANIFEST.in 2021-05-28 23:21:08.000000000 +0200
@@ -0,0 +1,4 @@
+include CHANGES.txt
+include LICENSE
+
+graft tests
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cligj-0.5.0/README.rst new/cligj-0.7.2/README.rst
--- old/cligj-0.5.0/README.rst 2018-09-26 17:58:55.000000000 +0200
+++ new/cligj-0.7.2/README.rst 2021-05-28 23:21:08.000000000 +0200
@@ -1,8 +1,8 @@
cligj
======
-.. image:: https://travis-ci.org/mapbox/cligj.svg
- :target: https://travis-ci.org/mapbox/cligj
+.. image:: https://travis-ci.com/mapbox/cligj.svg
+ :target: https://travis-ci.com/mapbox/cligj
.. image:: https://coveralls.io/repos/mapbox/cligj/badge.png?branch=master
:target: https://coveralls.io/r/mapbox/cligj?branch=master
@@ -10,7 +10,7 @@
Common arguments and options for GeoJSON processing commands, using Click.
`cligj` is for Python developers who create command line interfaces for geospatial data.
-`cligj` allows you to quickly build consistent, well-tested and interoperable CLIs for handling GeoJSON.
+`cligj` allows you to quickly build consistent, well-tested and interoperable CLIs for handling GeoJSON.
Arguments
@@ -76,11 +76,15 @@
reads and writes GeoJSON expects a text containing a single feature collection,
that's the default, and a LF-delimited sequence of texts containing one GeoJSON
feature each is a feature that is turned on using the ``--sequence`` option.
-To write sequences of feature texts that conform to the `JSON Text Sequences
-proposed standard
-<http://tools.ietf.org/html/draft-ietf-json-text-sequence-13>`__ (and might
-contain pretty-printed JSON) with the ASCII Record Separator (0x1e) as
-a delimiter, use the ``--rs`` option
+To write sequences of feature texts that conform to the `GeoJSON Text Sequences
+standard <https://tools.ietf.org/html/rfc8142>`__ (and might contain
+pretty-printed JSON) with the ASCII Record Separator (0x1e) as a delimiter, use
+the ``--rs`` option
+
+.. warning:: Future change warning
+ GeoJSON sequences (`--sequence`), not collections (`--no-sequence`), will be
+ the default in version 1.0.0.
+
.. code-block:: python
@@ -125,7 +129,6 @@
False).
--help Show this message and exit.
-
And can be used like this
.. code-block:: console
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cligj-0.5.0/cligj/__init__.py new/cligj-0.7.2/cligj/__init__.py
--- old/cligj-0.5.0/cligj/__init__.py 2018-09-26 17:58:55.000000000 +0200
+++ new/cligj-0.7.2/cligj/__init__.py 2021-05-28 23:21:08.000000000 +0200
@@ -1,12 +1,21 @@
-# cligj
+"""cligj
-# Shared arguments and options.
+A package of arguments, options, and parsers for the Python GeoJSON
+ecosystem.
+"""
+
+import sys
+from warnings import warn
import click
from .features import normalize_feature_inputs
-# Arguments.
+__version__ = "0.7.2"
+
+if sys.version_info < (3, 6):
+ warn("cligj 1.0.0 will require Python >= 3.6", FutureWarning)
+
# Multiple input files.
files_in_arg = click.argument(
@@ -97,8 +106,14 @@
'--sequence/--no-sequence',
default=False,
help="Write a LF-delimited sequence of texts containing individual "
- "objects or write a single JSON text containing a feature "
- "collection object (the default).")
+ "objects or write a single JSON text containing a feature "
+ "collection object (the default).",
+ callback=lambda ctx, param, value: warn(
+ "Sequences of Features, not FeatureCollections, will be the default in version 1.0.0",
+ FutureWarning,
+ )
+ or value,
+)
use_rs_opt = click.option(
'--rs/--no-rs',
@@ -109,8 +124,8 @@
"(default is False).")
-# GeoJSON output mode option.
def geojson_type_collection_opt(default=False):
+ """GeoJSON FeatureCollection output mode"""
return click.option(
'--collection',
'geojson_type',
@@ -120,6 +135,7 @@
def geojson_type_feature_opt(default=False):
+ """GeoJSON Feature or Feature sequence output mode"""
return click.option(
'--feature',
'geojson_type',
@@ -129,6 +145,7 @@
def geojson_type_bbox_opt(default=False):
+ """GeoJSON bbox output mode"""
return click.option(
'--bbox',
'geojson_type',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cligj-0.5.0/cligj/features.py new/cligj-0.7.2/cligj/features.py
--- old/cligj-0.5.0/cligj/features.py 2018-09-26 17:58:55.000000000 +0200
+++ new/cligj-0.7.2/cligj/features.py 2021-05-28 23:21:08.000000000 +0200
@@ -1,3 +1,5 @@
+"""Feature parsing and normalization"""
+
from itertools import chain
import json
import re
@@ -23,10 +25,16 @@
"[lng, lat]", or "lng, lat", or "lng lat".
If no value is provided, features will be read from stdin.
+
+ Yields
+ ------
+ Mapping
+ A GeoJSON Feature represented by a Python mapping
+
"""
for feature_like in value or ('-',):
try:
- with click.open_file(feature_like) as src:
+ with click.open_file(feature_like, encoding="utf-8") as src:
for feature in iter_features(iter(src)):
yield feature
except IOError:
@@ -55,6 +63,12 @@
A function that will be applied to each extracted feature. It
takes a feature object and may return a replacement feature or
None -- in which case iter_features does not yield.
+
+ Yields
+ ------
+ Mapping
+ A GeoJSON Feature represented by a Python mapping
+
"""
func = func or (lambda x: x)
first_line = next(geojsonfile)
@@ -136,9 +150,20 @@
def to_feature(obj):
- """Takes a feature or a geometry
- returns feature verbatim or
- wraps geom in a feature with empty properties
+ """Converts an object to a GeoJSON Feature
+
+ Returns feature verbatim or wraps geom in a feature with empty
+ properties.
+
+ Raises
+ ------
+ ValueError
+
+ Returns
+ -------
+ Mapping
+ A GeoJSON Feature represented by a Python mapping
+
"""
if obj['type'] == 'Feature':
return obj
@@ -177,13 +202,13 @@
an iterable of objects with a geo interface and
normalizes it to the former."""
for obj in feature_objs:
- if hasattr(obj, "__geo_interface__") and \
- 'type' in obj.__geo_interface__.keys() and \
- obj.__geo_interface__['type'] == 'Feature':
+ if (
+ hasattr(obj, "__geo_interface__")
+ and "type" in obj.__geo_interface__.keys()
+ and obj.__geo_interface__["type"] == "Feature"
+ ):
yield obj.__geo_interface__
- elif isinstance(obj, dict) and 'type' in obj and \
- obj['type'] == 'Feature':
+ elif isinstance(obj, dict) and "type" in obj and obj["type"] == "Feature":
yield obj
else:
- raise ValueError("Did not recognize object {0}"
- "as GeoJSON Feature".format(obj))
+ raise ValueError("Did not recognize object as GeoJSON Feature")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cligj-0.5.0/setup.cfg new/cligj-0.7.2/setup.cfg
--- old/cligj-0.5.0/setup.cfg 1970-01-01 01:00:00.000000000 +0100
+++ new/cligj-0.7.2/setup.cfg 2021-05-28 23:21:08.000000000 +0200
@@ -0,0 +1,2 @@
+[metadata]
+license_file = LICENSE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cligj-0.5.0/setup.py new/cligj-0.7.2/setup.py
--- old/cligj-0.5.0/setup.py 2018-09-26 17:58:55.000000000 +0200
+++ new/cligj-0.7.2/setup.py 2021-05-28 23:21:08.000000000 +0200
@@ -1,28 +1,32 @@
from codecs import open as codecs_open
+
from setuptools import setup, find_packages
+with open("cligj/__init__.py") as f:
+ for line in f:
+ if "__version__" in line:
+ version = line.split("=")[1].strip().strip('"').strip("'")
+ continue
-# Get the long description from the relevant file
with codecs_open('README.rst', encoding='utf-8') as f:
long_description = f.read()
-setup(name='cligj',
- version='0.5.0',
- description=u"Click params for commmand line interfaces to GeoJSON",
- long_description=long_description,
- classifiers=[],
- keywords='',
- author=u"Sean Gillies",
- author_email='sean(a)mapbox.com',
- url='https://github.com/mapbox/cligj',
- license='BSD',
- packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
- include_package_data=True,
- zip_safe=False,
- install_requires=[
- 'click >= 4.0, < 8'
- ],
- extras_require={
- 'test': ['pytest-cov'],
- })
+setup(
+ name="cligj",
+ version=version,
+ description=u"Click params for commmand line interfaces to GeoJSON",
+ long_description=long_description,
+ classifiers=[],
+ keywords="",
+ author=u"Sean Gillies",
+ author_email="sean(a)mapbox.com",
+ url="https://github.com/mapbox/cligj",
+ license="BSD",
+ packages=find_packages(exclude=["ez_setup", "examples", "tests"]),
+ include_package_data=True,
+ zip_safe=False,
+ python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4",
+ install_requires=["click >= 4.0"],
+ extras_require={"test": ["pytest-cov"],},
+)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cligj-0.5.0/tests/test_cli.py new/cligj-0.7.2/tests/test_cli.py
--- old/cligj-0.5.0/tests/test_cli.py 2018-09-26 17:58:55.000000000 +0200
+++ new/cligj-0.7.2/tests/test_cli.py 2021-05-28 23:21:08.000000000 +0200
@@ -1,7 +1,9 @@
import os
import os.path
+import sys
import click
+import pytest
import cligj
@@ -155,62 +157,67 @@
assert result.output.splitlines() == ['geographic']
-def test_sequence(runner):
+(a)pytest.mark.filterwarnings("ignore")
+(a)pytest.mark.parametrize(
+ ("opt", "val"),
+ [
+ ("--sequence", True),
+ ("--no-sequence", False),
+ (None, cligj.__version__.startswith("1.0")),
+ ],
+)
+def test_sequence(runner, opt, val):
+ """True becomes the default in 1.0"""
@click.command()
@cligj.sequence_opt
def cmd(sequence):
- click.echo("%s" % sequence)
+ click.echo(str(sequence))
- result = runner.invoke(cmd)
+ result = runner.invoke(cmd, [opt] if opt is not None else [])
assert not result.exception
- assert result.output.splitlines() == ['False']
+ assert result.output.splitlines() == [str(val)]
- result = runner.invoke(cmd, ['--sequence'])
- assert not result.exception
- assert result.output.splitlines() == ['True']
- result = runner.invoke(cmd, ['--no-sequence'])
- assert not result.exception
- assert result.output.splitlines() == ['False']
+(a)pytest.mark.skipif(sys.version_info < (3,), reason="Requires Python 3")
+(a)pytest.mark.xfail(cligj.__version__.startswith("1.0"), reason="No warning in 1.0")
+def test_sequence_warns(runner):
+ """Warn about --sequence until 1.0"""
+ @click.command()
+ @cligj.sequence_opt
+ def cmd(sequence):
+ click.echo(str(sequence))
+
+ with pytest.warns(FutureWarning):
+ result = runner.invoke(cmd, ["--sequence"])
-def test_sequence_rs(runner):
+(a)pytest.mark.filterwarnings("ignore")
+(a)pytest.mark.parametrize(("opt", "val"), [("--rs", True), (None, False)])
+def test_sequence_rs(runner, opt, val):
@click.command()
@cligj.sequence_opt
@cligj.use_rs_opt
def cmd(sequence, use_rs):
- click.echo("%s" % sequence)
- click.echo("%s" % use_rs)
+ click.echo(str(sequence))
+ click.echo(str(use_rs))
- result = runner.invoke(cmd, ['--sequence', '--rs'])
+ result = runner.invoke(cmd, ["--sequence"] + ([opt] if opt is not None else []))
assert not result.exception
- assert result.output.splitlines() == ['True', 'True']
-
- result = runner.invoke(cmd, ['--sequence'])
- assert not result.exception
- assert result.output.splitlines() == ['True', 'False']
+ assert result.output.splitlines() == ["True", str(val)]
-def test_geojson_type(runner):
+(a)pytest.mark.parametrize(
+ ("opt", "val"),
+ [("--collection", "collection"), ("--feature", "feature"), ("--bbox", "bbox")],
+)
+def test_geojson_type(runner, opt, val):
@click.command()
@cligj.geojson_type_collection_opt(True)
@cligj.geojson_type_feature_opt(False)
@cligj.geojson_type_bbox_opt(False)
def cmd(geojson_type):
- click.echo("%s" % geojson_type)
-
- result = runner.invoke(cmd)
- assert not result.exception
- assert result.output.splitlines() == ['collection']
-
- result = runner.invoke(cmd, ['--collection'])
- assert not result.exception
- assert result.output.splitlines() == ['collection']
-
- result = runner.invoke(cmd, ['--feature'])
- assert not result.exception
- assert result.output.splitlines() == ['feature']
+ click.echo(str(geojson_type))
- result = runner.invoke(cmd, ['--bbox'])
+ result = runner.invoke(cmd, [opt])
assert not result.exception
- assert result.output.splitlines() == ['bbox']
+ assert result.output.splitlines() == [val]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cligj-0.5.0/tests/twopoints.geojson new/cligj-0.7.2/tests/twopoints.geojson
--- old/cligj-0.5.0/tests/twopoints.geojson 2018-09-26 17:58:55.000000000 +0200
+++ new/cligj-0.7.2/tests/twopoints.geojson 2021-05-28 23:21:08.000000000 +0200
@@ -1 +1 @@
-{"features": [{"bbox": [-122.9292140099711, 45.37948199034149, -122.44106199104115, 45.858097009742835], "center": [-122.7282, 45.5801], "context": [{"id": "postcode.2503633822", "text": "97203"}, {"id": "region.3470299826", "text": "Oregon"}, {"id": "country.4150104525", "short_code": "us", "text": "United States"}], "geometry": {"coordinates": [-122.7282, 45.5801], "type": "Point"}, "id": "place.42767", "place_name": "Portland, Oregon, United States", "properties": {}, "relevance": 0.999, "text": "Portland", "type": "Feature"}, {"bbox": [-121.9779540096568, 43.74737999114854, -120.74788099000016, 44.32812500969035], "center": [-121.3153, 44.0582], "context": [{"id": "postcode.3332732485", "text": "97701"}, {"id": "region.3470299826", "text": "Oregon"}, {"id": "country.4150104525", "short_code": "us", "text": "United States"}], "geometry": {"coordinates": [-121.3153, 44.0582], "type": "Point"}, "id": "place.3965", "place_name": "Bend, Oregon, United States", "properties": {}, "rele
vance": 0.999, "text": "Bend", "type": "Feature"}], "type": "FeatureCollection"}
+{"features": [{"bbox": [-122.9292140099711, 45.37948199034149, -122.44106199104115, 45.858097009742835], "center": [-122.7282, 45.5801], "context": [{"id": "postcode.2503633822", "text": "97203"}, {"id": "region.3470299826", "text": "Oregon"}, {"id": "country.4150104525", "short_code": "us", "text": "United States"}], "geometry": {"coordinates": [-122.7282, 45.5801], "type": "Point"}, "id": "place.42767", "place_name": "Portland, Oregon, United States", "properties": {}, "relevance": 0.999, "text": "Portland", "type": "Feature"}, {"bbox": [-121.9779540096568, 43.74737999114854, -120.74788099000016, 44.32812500969035], "center": [-121.3153, 44.0582], "context": [{"id": "postcode.3332732485", "text": "97701"}, {"id": "region.3470299826", "text": "Oregon"}, {"id": "country.4150104525", "short_code": "us", "text": "United States"}], "geometry": {"coordinates": [-121.3153, 44.0582], "type": "Point"}, "id": "place.3965", "place_name": "Bend, ����regon, United States", "properties": {}, "r
elevance": 0.999, "text": "Bend", "type": "Feature"}], "type": "FeatureCollection"}
2
1
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package 000update-repos for openSUSE:Factory checked in at 2023-10-31 21:04:50
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/000update-repos (Old)
and /work/SRC/openSUSE:Factory/.000update-repos.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "000update-repos"
Tue Oct 31 21:04:50 2023 rev:2369 rq: version:unknown
Changes:
--------
New Changes file:
NO CHANGES FILE!!!
New:
----
factory:non-oss_3784.2.packages.zst
factory_20231029.packages.zst
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package 000release-packages for openSUSE:Factory checked in at 2023-10-31 20:41:37
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/000release-packages (Old)
and /work/SRC/openSUSE:Factory/.000release-packages.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "000release-packages"
Tue Oct 31 20:41:37 2023 rev:2569 rq: version:unknown
Changes:
--------
New Changes file:
NO CHANGES FILE!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ Aeon-release.spec ++++++
--- /var/tmp/diff_new_pack.iheuYV/_old 2023-10-31 20:41:40.296445181 +0100
+++ /var/tmp/diff_new_pack.iheuYV/_new 2023-10-31 20:41:40.296445181 +0100
@@ -17,7 +17,7 @@
Name: Aeon-release
-Version: 20231030
+Version: 20231031
Release: 0
Summary: openSUSE Aeon
License: GPL-2.0-or-later
@@ -172,9 +172,9 @@
%include %{SOURCE100}
Provides: %name-%version
Provides: product() = Aeon
-Provides: product(Aeon) = 20231030-0
+Provides: product(Aeon) = 20231031-0
Provides: product-label() = openSUSE%20Aeon
-Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aaeon%3A20231030
+Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aaeon%3A20231031
Provides: product-url(releasenotes) = http%3A%2F%2Fdoc.opensuse.org%2Frelease%2Dnotes%2Fx86_64%2FopenSUSE%2FTumbleweed%2Frelease%2Dnotes%2DopenSUSE.rpm
Provides: product-endoflife()
Requires: product_flavor(Aeon)
@@ -190,7 +190,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance)
-Provides: product_flavor(Aeon) = 20231030-0
+Provides: product_flavor(Aeon) = 20231031-0
Summary: openSUSE Aeon%{?betaversion: %{betaversion}}
%description appliance
@@ -255,11 +255,11 @@
<product schemeversion="0">
<vendor>openSUSE</vendor>
<name>Aeon</name>
- <version>20231030</version>
+ <version>20231031</version>
<release>0</release>
<endoflife></endoflife>
<arch>%{_target_cpu}</arch>
- <cpeid>cpe:/o:opensuse:aeon:20231030</cpeid>
+ <cpeid>cpe:/o:opensuse:aeon:20231031</cpeid>
<productline>Aeon</productline>
<register>
<pool>
++++++ MicroOS-release.spec ++++++
--- /var/tmp/diff_new_pack.iheuYV/_old 2023-10-31 20:41:40.324446211 +0100
+++ /var/tmp/diff_new_pack.iheuYV/_new 2023-10-31 20:41:40.324446211 +0100
@@ -17,7 +17,7 @@
Name: MicroOS-release
-Version: 20231030
+Version: 20231031
Release: 0
Summary: openSUSE MicroOS
License: GPL-2.0-or-later
@@ -177,9 +177,9 @@
%include %{SOURCE100}
Provides: %name-%version
Provides: product() = MicroOS
-Provides: product(MicroOS) = 20231030-0
+Provides: product(MicroOS) = 20231031-0
Provides: product-label() = openSUSE%20MicroOS
-Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Amicroos%3A20231030
+Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Amicroos%3A20231031
Provides: product-url(releasenotes) = http%3A%2F%2Fdoc.opensuse.org%2Frelease%2Dnotes%2Fx86_64%2FopenSUSE%2FTumbleweed%2Frelease%2Dnotes%2DopenSUSE.rpm
Provides: product-endoflife()
Requires: product_flavor(MicroOS)
@@ -195,7 +195,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(dvd)
-Provides: product_flavor(MicroOS) = 20231030-0
+Provides: product_flavor(MicroOS) = 20231031-0
Summary: openSUSE MicroOS%{?betaversion: %{betaversion}}
%description dvd
@@ -211,7 +211,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance)
-Provides: product_flavor(MicroOS) = 20231030-0
+Provides: product_flavor(MicroOS) = 20231031-0
Summary: openSUSE MicroOS%{?betaversion: %{betaversion}}
%description appliance
@@ -276,11 +276,11 @@
<product schemeversion="0">
<vendor>openSUSE</vendor>
<name>MicroOS</name>
- <version>20231030</version>
+ <version>20231031</version>
<release>0</release>
<endoflife></endoflife>
<arch>%{_target_cpu}</arch>
- <cpeid>cpe:/o:opensuse:microos:20231030</cpeid>
+ <cpeid>cpe:/o:opensuse:microos:20231031</cpeid>
<productline>MicroOS</productline>
<register>
<pool>
++++++ openSUSE-Addon-NonOss-release.spec ++++++
--- /var/tmp/diff_new_pack.iheuYV/_old 2023-10-31 20:41:40.352447240 +0100
+++ /var/tmp/diff_new_pack.iheuYV/_new 2023-10-31 20:41:40.352447240 +0100
@@ -1,5 +1,5 @@
#
-# spec file for package openSUSE-Addon-NonOss-release (Version 20231030)
+# spec file for package openSUSE-Addon-NonOss-release (Version 20231031)
#
# Copyright (c) 2023 openSUSE.
#
@@ -16,7 +16,7 @@
Name: openSUSE-Addon-NonOss-release
%define product openSUSE-Addon-NonOss
Summary: openSUSE NonOSS Addon%{?betaversion: %{betaversion}}
-Version: 20231030
+Version: 20231031
#!BcntSyncTag: openSUSE-Addon-NonOss
Release: 0
License: BSD-3-Clause
@@ -25,9 +25,9 @@
Provides: %name-%version
Provides: product() = openSUSE%2DAddon%2DNonOss
-Provides: product(openSUSE-Addon-NonOss) = 20231030-0
+Provides: product(openSUSE-Addon-NonOss) = 20231031-0
Provides: product-label() = non%20oss%20addon
-Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aopensuse%2Daddon%2Dnonoss%3A20231030
+Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aopensuse%2Daddon%2Dnonoss%3A20231031
AutoReqProv: on
@@ -50,10 +50,10 @@
<product schemeversion="0">
<vendor>openSUSE</vendor>
<name>openSUSE-Addon-NonOss</name>
- <version>20231030</version>
+ <version>20231031</version>
<release>0</release>
<arch>%{_target_cpu}</arch>
- <cpeid>cpe:/o:opensuse:opensuse-addon-nonoss:20231030</cpeid>
+ <cpeid>cpe:/o:opensuse:opensuse-addon-nonoss:20231031</cpeid>
<register>
<pool>
</pool>
++++++ openSUSE-release.spec ++++++
--- /var/tmp/diff_new_pack.iheuYV/_old 2023-10-31 20:41:40.384448417 +0100
+++ /var/tmp/diff_new_pack.iheuYV/_new 2023-10-31 20:41:40.384448417 +0100
@@ -20,7 +20,7 @@
#define betaversion %{nil}
%define codename Tumbleweed
Name: openSUSE-release
-Version: 20231030
+Version: 20231031
Release: 0
# 0 is the product release, not the build release of this package
Summary: openSUSE Tumbleweed
@@ -181,7 +181,7 @@
%include %{SOURCE100}
Provides: %name-%version
Provides: product() = openSUSE
-Provides: product(openSUSE) = 20231030-0
+Provides: product(openSUSE) = 20231031-0
%ifarch x86_64
Provides: product-register-target() = openSUSE%2DTumbleweed%2Dx86_64
%endif
@@ -195,7 +195,7 @@
Provides: product-register-target() = openSUSE%2DTumbleweed%2Daarch64
%endif
Provides: product-label() = openSUSE
-Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aopensuse%3A20231030
+Provides: product-cpeid() = cpe%3A%2Fo%3Aopensuse%3Aopensuse%3A20231031
Provides: product-url(releasenotes) = http%3A%2F%2Fdoc.opensuse.org%2Frelease%2Dnotes%2Fx86_64%2FopenSUSE%2FTumbleweed%2Frelease%2Dnotes%2DopenSUSE.rpm
Provides: product-url(repository) = http%3A%2F%2Fdownload.opensuse.org%2Ftumbleweed%2Frepo%2Foss%2F
Requires: product_flavor(openSUSE)
@@ -209,7 +209,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(ftp)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description ftp
@@ -224,7 +224,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(mini)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description mini
@@ -239,7 +239,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(dvd)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description dvd
@@ -254,7 +254,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(livecd-kde)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description livecd-kde
@@ -269,7 +269,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(livecd-x11)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description livecd-x11
@@ -284,7 +284,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(livecd-gnome)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description livecd-gnome
@@ -299,7 +299,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(livecd-xfce)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description livecd-xfce
@@ -314,7 +314,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(usb-kde)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description usb-kde
@@ -329,7 +329,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(usb-gnome)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description usb-gnome
@@ -344,7 +344,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(usb-x11)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description usb-x11
@@ -359,7 +359,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance
@@ -374,7 +374,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-docker)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-docker
@@ -389,7 +389,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-kvm)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-kvm
@@ -404,7 +404,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-vmware)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-vmware
@@ -419,7 +419,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-openstack)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-openstack
@@ -434,7 +434,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-hyperv)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-hyperv
@@ -449,7 +449,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-vagrant)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-vagrant
@@ -464,7 +464,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-wsl)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-wsl
@@ -479,7 +479,7 @@
Group: System/Fhs
Provides: product_flavor()
Provides: flavor(appliance-custom)
-Provides: product_flavor(openSUSE) = 20231030-0
+Provides: product_flavor(openSUSE) = 20231031-0
Summary: openSUSE Tumbleweed%{?betaversion: %{betaversion}}
%description appliance-custom
@@ -559,10 +559,10 @@
<product schemeversion="0">
<vendor>openSUSE</vendor>
<name>openSUSE</name>
- <version>20231030</version>
+ <version>20231031</version>
<release>0</release>
<arch>%{_target_cpu}</arch>
- <cpeid>cpe:/o:opensuse:opensuse:20231030</cpeid>
+ <cpeid>cpe:/o:opensuse:opensuse:20231031</cpeid>
<productline>openSUSE</productline>
<register>
<target>openSUSE-Tumbleweed-x86_64</target>
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package bonk for openSUSE:Factory checked in at 2023-10-31 20:26:37
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/bonk (Old)
and /work/SRC/openSUSE:Factory/.bonk.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "bonk"
Tue Oct 31 20:26:37 2023 rev:2 rq:1121459 version:0.3.2+g4
Changes:
--------
--- /work/SRC/openSUSE:Factory/bonk/bonk.changes 2023-01-26 14:14:16.637494489 +0100
+++ /work/SRC/openSUSE:Factory/.bonk.new.17445/bonk.changes 2023-10-31 20:26:54.676609991 +0100
@@ -1,0 +2,6 @@
+Tue Oct 31 12:11:28 UTC 2023 - Soc Virnyl Estela <contact(a)uncomfyhalomacro.pl>
+
+- Update to version 0.3.2+g4:
+ * Update main.rs. fixes issues when parameters creates files
+
+-------------------------------------------------------------------
Old:
----
bonk-0.3.2.tar.gz
New:
----
bonk-0.3.2+g4.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ bonk.spec ++++++
--- /var/tmp/diff_new_pack.uwYIck/_old 2023-10-31 20:26:55.200629239 +0100
+++ /var/tmp/diff_new_pack.uwYIck/_new 2023-10-31 20:26:55.200629239 +0100
@@ -1,7 +1,7 @@
#
# spec file for package bonk
#
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: bonk
-Version: 0.3.2
+Version: 0.3.2+g4
Release: 0
Summary: Touch with mkdir tool
License: MIT
++++++ _service ++++++
--- /var/tmp/diff_new_pack.uwYIck/_old 2023-10-31 20:26:55.228630268 +0100
+++ /var/tmp/diff_new_pack.uwYIck/_new 2023-10-31 20:26:55.232630415 +0100
@@ -1,9 +1,9 @@
<services>
<service mode="disabled" name="obs_scm">
<param name="url">https://github.com/elliot40404/bonk</param>
- <param name="versionformat">@PARENT_TAG@</param>
+ <param name="versionformat">@PARENT_TAG@+g@TAG_OFFSET@</param>
<param name="scm">git</param>
- <param name="revision">be538d35f4a6f86fa01e664f7c91e0e00c2bea43</param>
+ <param name="revision">bd8a0a3edd3daa6ccddcc752a0dbfca5866b935a</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="versionrewrite-replacement">\1</param>
<param name="changesgenerate">enable</param>
@@ -16,12 +16,8 @@
</service>
<service mode="disabled" name="set_version"/>
<service name="cargo_vendor" mode="disabled">
- <param name="srcdir">bonk</param>
- <param name="compression">gz</param>
- <param name="update">true</param>
- </service>
- <service name="cargo_audit" mode="disabled">
- <param name="srcdir">bonk</param>
+ <param name="src">bonk-*.tar.gz</param>
</service>
+ <service name="cargo_audit" mode="disabled" />
</services>
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package perl-Image-ExifTool for openSUSE:Factory checked in at 2023-10-31 20:26:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Image-ExifTool (Old)
and /work/SRC/openSUSE:Factory/.perl-Image-ExifTool.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Image-ExifTool"
Tue Oct 31 20:26:36 2023 rev:57 rq:1121442 version:12.69
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Image-ExifTool/perl-Image-ExifTool.changes 2023-10-19 22:51:56.668496798 +0200
+++ /work/SRC/openSUSE:Factory/.perl-Image-ExifTool.new.17445/perl-Image-ExifTool.changes 2023-10-31 20:26:52.076514489 +0100
@@ -1,0 +2,20 @@
+Mon Oct 30 21:28:07 UTC 2023 - Michael Vetter <mvetter(a)suse.com>
+
+- Update to 12.69:
+ * Added support for DNG version 1.7.0.0
+ * Added a new XMP-GCamera tag
+ * Added a number of new Nikon Z lenses
+ * Added a number of new XMP-crs tags
+ * Extract XML metadata from some Hasselblad images
+ * Tweaked -fast2 option to read metadata from inside mdat atom
+ of HEIC images
+ * Patched FFF reader to be more tolerant of the mess made by
+ incompetent Hasselblad programmers (wrong IFD count for some values)
+ * Patched WebP reader to be more tolerant of the mess made by
+ incompetent Google programmers (EXIF with wrong header and XMP
+ with wrong ID)
+ * Fixed problem which could cause "use of uninitialized variable"
+ warnings when reading images from some Nikon cameras
+ * Fixed List type for new XMP-photomech:CreatorIdentity tag
+
+-------------------------------------------------------------------
Old:
----
Image-ExifTool-12.68.tar.gz
New:
----
Image-ExifTool-12.69.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Image-ExifTool.spec ++++++
--- /var/tmp/diff_new_pack.56eypd/_old 2023-10-31 20:26:53.740575611 +0100
+++ /var/tmp/diff_new_pack.56eypd/_new 2023-10-31 20:26:53.740575611 +0100
@@ -18,7 +18,7 @@
%define cpan_name Image-ExifTool
Name: perl-Image-ExifTool
-Version: 12.68
+Version: 12.69
Release: 0
License: Artistic-1.0 OR GPL-1.0-or-later
Summary: Read and write meta information
++++++ Image-ExifTool-12.68.tar.gz -> Image-ExifTool-12.69.tar.gz ++++++
++++ 26542 lines of diff (skipped)
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package postgresql14 for openSUSE:Factory checked in at 2023-10-31 20:26:33
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/postgresql14 (Old)
and /work/SRC/openSUSE:Factory/.postgresql14.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "postgresql14"
Tue Oct 31 20:26:33 2023 rev:14 rq:1121434 version:14.9
Changes:
--------
--- /work/SRC/openSUSE:Factory/postgresql14/postgresql14.changes 2023-10-25 18:05:36.720071561 +0200
+++ /work/SRC/openSUSE:Factory/.postgresql14.new.17445/postgresql14.changes 2023-10-31 20:26:50.344450871 +0100
@@ -1,0 +2,6 @@
+Tue Oct 31 10:57:13 UTC 2023 - Reinhard Max <max(a)suse.com>
+
+- boo#1216734: Revert the last change and make the devel package
+ independend of all other subpackages except for the libs.
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ postgresql14.spec ++++++
--- /var/tmp/diff_new_pack.IxVPON/_old 2023-10-31 20:26:51.064477318 +0100
+++ /var/tmp/diff_new_pack.IxVPON/_new 2023-10-31 20:26:51.064477318 +0100
@@ -760,7 +760,9 @@
mkdir -p %buildroot%pgmandir/man1
cp -a doc/src/sgml/man1/ecpg.1 %buildroot%pgmandir/man1/ecpg.1pg%pgmajor
%find_lang ecpg-$VLANG devel.files
-ln -s %pgbindir/ecpg %buildroot%_bindir/ecpg
+# The devel subpackage is exclusive across versions
+# and not handled by update-alternatives.
+mv %buildroot%pgbindir/ecpg %buildroot%_bindir/ecpg
%if !%mini
%find_lang pg_config-$VLANG server-devel.files
@@ -960,10 +962,9 @@
%dir %pgbasedir
%dir %pgbindir
-%ghost %_bindir/ecpg
+%_bindir/ecpg
%_libdir/pkgconfig/*
%_libdir/lib*.so
-%pgbindir/ecpg
%pgincludedir
%if %{with server_devel}
%exclude %pgincludedir/server
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package postgresql11 for openSUSE:Factory checked in at 2023-10-31 20:26:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/postgresql11 (Old)
and /work/SRC/openSUSE:Factory/.postgresql11.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "postgresql11"
Tue Oct 31 20:26:34 2023 rev:31 rq:1121438 version:11.21
Changes:
--------
--- /work/SRC/openSUSE:Factory/postgresql11/postgresql11.changes 2023-08-11 15:55:50.679874038 +0200
+++ /work/SRC/openSUSE:Factory/.postgresql11.new.17445/postgresql11.changes 2023-10-31 20:26:51.244483929 +0100
@@ -1,0 +2,22 @@
+Tue Oct 31 10:57:13 UTC 2023 - Reinhard Max <max(a)suse.com>
+
+- boo#1216734: Revert the last change and make the devel package
+ independend of all other subpackages except for the libs.
+
+-------------------------------------------------------------------
+Tue Oct 10 12:49:02 UTC 2023 - Reinhard Max <max(a)suse.com>
+
+- boo#1216022: Call install-alternatives from the devel subpackage
+ as well, otherwise the symlink for ecpg might be missing.
+
+-------------------------------------------------------------------
+Mon Sep 18 15:24:14 UTC 2023 - Dominique Leuenberger <dimstar(a)opensuse.org>
+
+- Also buildignore the postgresql*-implementation symbols: this is
+ needed in order to bootstrap when no postgresql version currently
+ has valid symbols provided. Once the packages are built, OBS
+ could translate this to the pgname-* packages and accept the
+ ignores; during bootstrap though, there is nothing providing the
+ symbol and the existing buildignores do not suffice.
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ postgresql11.spec ++++++
--- /var/tmp/diff_new_pack.EhVQwX/_old 2023-10-31 20:26:51.828505381 +0100
+++ /var/tmp/diff_new_pack.EhVQwX/_new 2023-10-31 20:26:51.828505381 +0100
@@ -159,6 +159,10 @@
#!BuildIgnore: %pgname-pltcl
#!BuildIgnore: %pgname-plperl
#!BuildIgnore: %pgname-plpython
+#!BuildIgnore: postgresql-implementation
+#!BuildIgnore: postgresql-server-implementation
+#!BuildIgnore: postgresql-server-devel-implementation
+#!BuildIgnore: postgresql-llvmjit-devel-implementation
Summary: Basic Clients and Utilities for PostgreSQL
License: PostgreSQL
Group: Productivity/Databases/Tools
@@ -505,7 +509,7 @@
touch -r configure tmp
%patch1
%patch4
-%patch8 -p1
+%patch8
%patch9
%if %{with llvm}
%patch10
@@ -756,7 +760,9 @@
mkdir -p %buildroot%pgmandir/man1
cp -a doc/src/sgml/man1/ecpg.1 %buildroot%pgmandir/man1/ecpg.1pg%pgmajor
%find_lang ecpg-$VLANG devel.files
-ln -s %pgbindir/ecpg %buildroot%_bindir/ecpg
+# The devel subpackage is exclusive across versions
+# and not handled by update-alternatives.
+mv %buildroot%pgbindir/ecpg %buildroot%_bindir/ecpg
%if !%mini
%find_lang pg_config-$VLANG server-devel.files
@@ -791,17 +797,19 @@
%post -n %pgname-%devel
/sbin/ldconfig
-%if %{with server_devel}
-%post server-devel
-%endif
/usr/share/postgresql/install-alternatives %pgmajor
%postun -n %pgname-%devel
/sbin/ldconfig
+/usr/share/postgresql/install-alternatives %pgmajor
+
%if %{with server_devel}
+%post server-devel
+/usr/share/postgresql/install-alternatives %pgmajor
+
%postun server-devel
-%endif
/usr/share/postgresql/install-alternatives %pgmajor
+%endif
%if !%mini
@@ -954,10 +962,9 @@
%dir %pgbasedir
%dir %pgbindir
-%ghost %_bindir/ecpg
+%_bindir/ecpg
%_libdir/pkgconfig/*
%_libdir/lib*.so
-%pgbindir/ecpg
%pgincludedir
%if %{with server_devel}
%exclude %pgincludedir/server
++++++ postgresql-testsuite-keep-results-file.patch ++++++
--- /var/tmp/diff_new_pack.EhVQwX/_old 2023-10-31 20:26:51.896507878 +0100
+++ /var/tmp/diff_new_pack.EhVQwX/_new 2023-10-31 20:26:51.900508025 +0100
@@ -4,10 +4,10 @@
don't unlink the result file
-Index: postgresql-11beta1/src/test/regress/pg_regress.c
+Index: src/test/regress/pg_regress.c
===================================================================
---- postgresql-11beta1.orig/src/test/regress/pg_regress.c
-+++ postgresql-11beta1/src/test/regress/pg_regress.c
+--- src/test/regress/pg_regress.c
++++ src/test/regress/pg_regress.c
@@ -2574,7 +2574,6 @@ regression_main(int argc, char *argv[],
else
{
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package postgresql13 for openSUSE:Factory checked in at 2023-10-31 20:26:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/postgresql13 (Old)
and /work/SRC/openSUSE:Factory/.postgresql13.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "postgresql13"
Tue Oct 31 20:26:32 2023 rev:25 rq:1121433 version:13.12
Changes:
--------
--- /work/SRC/openSUSE:Factory/postgresql13/postgresql13.changes 2023-10-25 18:05:38.084117436 +0200
+++ /work/SRC/openSUSE:Factory/.postgresql13.new.17445/postgresql13.changes 2023-10-31 20:26:49.312412964 +0100
@@ -1,0 +2,6 @@
+Tue Oct 31 10:57:13 UTC 2023 - Reinhard Max <max(a)suse.com>
+
+- boo#1216734: Revert the last change and make the devel package
+ independend of all other subpackages except for the libs.
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ postgresql13.spec ++++++
--- /var/tmp/diff_new_pack.ZREE2C/_old 2023-10-31 20:26:49.972437207 +0100
+++ /var/tmp/diff_new_pack.ZREE2C/_new 2023-10-31 20:26:49.976437354 +0100
@@ -760,7 +760,9 @@
mkdir -p %buildroot%pgmandir/man1
cp -a doc/src/sgml/man1/ecpg.1 %buildroot%pgmandir/man1/ecpg.1pg%pgmajor
%find_lang ecpg-$VLANG devel.files
-ln -s %pgbindir/ecpg %buildroot%_bindir/ecpg
+# The devel subpackage is exclusive across versions
+# and not handled by update-alternatives.
+mv %buildroot%pgbindir/ecpg %buildroot%_bindir/ecpg
%if !%mini
%find_lang pg_config-$VLANG server-devel.files
@@ -960,10 +962,9 @@
%dir %pgbasedir
%dir %pgbindir
-%ghost %_bindir/ecpg
+%_bindir/ecpg
%_libdir/pkgconfig/*
%_libdir/lib*.so
-%pgbindir/ecpg
%pgincludedir
%if %{with server_devel}
%exclude %pgincludedir/server
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package postgresql12 for openSUSE:Factory checked in at 2023-10-31 20:26:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/postgresql12 (Old)
and /work/SRC/openSUSE:Factory/.postgresql12.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "postgresql12"
Tue Oct 31 20:26:30 2023 rev:31 rq:1121432 version:12.16
Changes:
--------
--- /work/SRC/openSUSE:Factory/postgresql12/postgresql12.changes 2023-10-25 18:05:39.360160352 +0200
+++ /work/SRC/openSUSE:Factory/.postgresql12.new.17445/postgresql12.changes 2023-10-31 20:26:48.312376233 +0100
@@ -1,0 +2,6 @@
+Tue Oct 31 10:57:13 UTC 2023 - Reinhard Max <max(a)suse.com>
+
+- boo#1216734: Revert the last change and make the devel package
+ independend of all other subpackages except for the libs.
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ postgresql12.spec ++++++
--- /var/tmp/diff_new_pack.reNkP7/_old 2023-10-31 20:26:49.132406353 +0100
+++ /var/tmp/diff_new_pack.reNkP7/_new 2023-10-31 20:26:49.136406499 +0100
@@ -760,7 +760,9 @@
mkdir -p %buildroot%pgmandir/man1
cp -a doc/src/sgml/man1/ecpg.1 %buildroot%pgmandir/man1/ecpg.1pg%pgmajor
%find_lang ecpg-$VLANG devel.files
-ln -s %pgbindir/ecpg %buildroot%_bindir/ecpg
+# The devel subpackage is exclusive across versions
+# and not handled by update-alternatives.
+mv %buildroot%pgbindir/ecpg %buildroot%_bindir/ecpg
%if !%mini
%find_lang pg_config-$VLANG server-devel.files
@@ -960,10 +962,9 @@
%dir %pgbasedir
%dir %pgbindir
-%ghost %_bindir/ecpg
+%_bindir/ecpg
%_libdir/pkgconfig/*
%_libdir/lib*.so
-%pgbindir/ecpg
%pgincludedir
%if %{with server_devel}
%exclude %pgincludedir/server
1
0
Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ntfs2btrfs for openSUSE:Factory checked in at 2023-10-31 20:26:28
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ntfs2btrfs (Old)
and /work/SRC/openSUSE:Factory/.ntfs2btrfs.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ntfs2btrfs"
Tue Oct 31 20:26:28 2023 rev:2 rq:1121427 version:20230501
Changes:
--------
--- /work/SRC/openSUSE:Factory/ntfs2btrfs/ntfs2btrfs.changes 2023-10-24 20:09:30.395031778 +0200
+++ /work/SRC/openSUSE:Factory/.ntfs2btrfs.new.17445/ntfs2btrfs.changes 2023-10-31 20:26:47.560348610 +0100
@@ -1,0 +2,10 @@
+Tue Oct 24 00:00:00 CEST 2023 - dsterba(a)suse.cz
+
+- Update to version 20230501:
+ * Fixed inline extent items being written out of order (not diagnosed by
+ btrfs check)
+ * Fixed metadata items being written with wrong level value (not diagnosed by
+ btrfs check)
+ * ADSes with overly-long names now get skipped
+
+-------------------------------------------------------------------
Old:
----
20220812.tar.gz
New:
----
20230501.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ntfs2btrfs.spec ++++++
--- /var/tmp/diff_new_pack.Z9Kfzv/_old 2023-10-31 20:26:48.064367123 +0100
+++ /var/tmp/diff_new_pack.Z9Kfzv/_new 2023-10-31 20:26:48.064367123 +0100
@@ -1,7 +1,7 @@
#
# spec file for package ntfs2btrfs
#
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -16,7 +16,7 @@
#
-%define tag 20220812
+%define tag 20230501
Name: ntfs2btrfs
Version: %{tag}
Release: 0
++++++ 20220812.tar.gz -> 20230501.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ntfs2btrfs-20220812/CMakeLists.txt new/ntfs2btrfs-20230501/CMakeLists.txt
--- old/ntfs2btrfs-20220812/CMakeLists.txt 2022-08-12 02:07:00.000000000 +0200
+++ new/ntfs2btrfs-20230501/CMakeLists.txt 2023-05-01 22:59:36.000000000 +0200
@@ -3,7 +3,7 @@
cmake_policy(SET CMP0091 NEW)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
-project(ntfs2btrfs VERSION 20220812)
+project(ntfs2btrfs VERSION 20230501)
include(GNUInstallDirs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ntfs2btrfs-20220812/README.md new/ntfs2btrfs-20230501/README.md
--- old/ntfs2btrfs-20220812/README.md 2022-08-12 02:07:00.000000000 +0200
+++ new/ntfs2btrfs-20230501/README.md 2023-05-01 22:59:36.000000000 +0200
@@ -37,10 +37,12 @@
download the latest Zip file, or use [Scoop](https://github.com/ScoopInstaller/Main/blob/master/bucket/ntfs2btrfs….
For Linux:
-* [Arch](https://aur.archlinux.org/packages/ntfs2btrfs-git) (thanks to [nicman23](https://github.com/nicman23))
+* [Arch](https://aur.archlinux.org/packages/ntfs2btrfs)
* [Fedora](https://src.fedoraproject.org/rpms/ntfs2btrfs) (thanks to [Conan-Kudo](https://github.com/Conan-Kudo))
-* [Gentoo ebuild](https://raw.githubusercontent.com/maharmstone/ntfs2btrfs/master/ntf…
-* [Debian & Ubuntu](https://sid.ethz.ch/debian/ntfs2btrfs/) (thanks to [alexmyczko](https://github.com/alexmyczko))
+* Gentoo - available as sys-fs/ntfs2btrfs in the guru repository
+* [Debian](https://packages.debian.org/ntfs2btrfs) (thanks to [alexmyczko](https://github.com/alexmyczko))
+* [Ubuntu](https://packages.ubuntu.com/ntfs2btrfs) (thanks to [alexmyczko](https://github.com/alexmyczko))
+* [openSUSE](https://build.opensuse.org/package/show/filesystems/ntfs2btrfs) (thanks to David Sterba)
For other distributions or operating systems, you will need to compile it yourself - see
below.
@@ -48,6 +50,11 @@
Changelog
---------
+* 20230501
+ * Fixed inline extent items being written out of order (not diagnosed by `btrfs check`)
+ * Fixed metadata items being written with wrong level value (not diagnosed by `btrfs check`)
+ * ADSes with overly-long names now get skipped
+
* 20220812
* Added --no-datasum option, to skip calculating checksums
* LXSS / WSL metadata is now preserved
@@ -93,7 +100,9 @@
On Linux:
- cmake .
+ mkdir build
+ cd build
+ cmake ..
make
You'll also need [libfmt](https://github.com/fmtlib/fmt) installed - it should be
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ntfs2btrfs-20220812/ntfs2btrfs-20210923.ebuild new/ntfs2btrfs-20230501/ntfs2btrfs-20210923.ebuild
--- old/ntfs2btrfs-20220812/ntfs2btrfs-20210923.ebuild 2022-08-12 02:07:00.000000000 +0200
+++ new/ntfs2btrfs-20230501/ntfs2btrfs-20210923.ebuild 1970-01-01 01:00:00.000000000 +0100
@@ -1,42 +0,0 @@
-# Copyright 2021 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-inherit cmake
-
-DESCRIPTION="Conversion tool from NTFS to Btrfs"
-HOMEPAGE="https://github.com/maharmstone/ntfs2btrfs"
-
-if [[ ${PV} = *9999 ]]; then
- inherit git-r3
- EGIT_REPO_URI="https://github.com/maharmstone/ntfs2btrfs.git"
-else
- SRC_URI="https://github.com/maharmstone/${PN}/archive/${PV}.tar.gz -> ${P}.tar.gz"
- KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~x86"
-fi
-
-LICENSE="GPL-2"
-SLOT="0"
-IUSE="+zlib +lzo +zstd"
-
-DEPEND="dev-libs/libfmt
- zlib? ( sys-libs/zlib )
- lzo? ( dev-libs/lzo )
- zstd? ( app-arch/zstd )"
-RDEPEND="${DEPEND}"
-BDEPEND=""
-
-src_prepare() {
- cmake_src_prepare
-}
-
-src_configure() {
- local mycmakeargs=(
- -DWITH_ZLIB=$(usex zlib)
- -DWITH_LZO=$(usex lzo)
- -DWITH_ZSTD=$(usex zstd)
- )
-
- cmake_src_configure
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ntfs2btrfs-20220812/ntfs2btrfs.8.in new/ntfs2btrfs-20230501/ntfs2btrfs.8.in
--- old/ntfs2btrfs-20220812/ntfs2btrfs.8.in 2022-08-12 02:07:00.000000000 +0200
+++ new/ntfs2btrfs-20230501/ntfs2btrfs.8.in 2023-05-01 22:59:36.000000000 +0200
@@ -1,4 +1,4 @@
-.TH NTFS2BTRFS "8" "August 2022" "ntfs2btrfs @PROJECT_VERSION@" "System Administration"
+.TH NTFS2BTRFS "8" "May 2023" "ntfs2btrfs @PROJECT_VERSION@" "System Administration"
.SH NAME
ntfs2btrfs \- convert ntfs filesystem to btrfs filesystem
.SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ntfs2btrfs-20220812/src/btrfs.h new/ntfs2btrfs-20230501/src/btrfs.h
--- old/ntfs2btrfs-20220812/src/btrfs.h 2022-08-12 02:07:00.000000000 +0200
+++ new/ntfs2btrfs-20230501/src/btrfs.h 2023-05-01 22:59:36.000000000 +0200
@@ -16,36 +16,38 @@
#define MAX_LABEL_SIZE 0x100
#define SUBVOL_ROOT_INODE 0x100
-#define TYPE_INODE_ITEM 0x01
-#define TYPE_INODE_REF 0x0C
-#define TYPE_INODE_EXTREF 0x0D
-#define TYPE_XATTR_ITEM 0x18
-#define TYPE_ORPHAN_INODE 0x30
-#define TYPE_DIR_ITEM 0x54
-#define TYPE_DIR_INDEX 0x60
-#define TYPE_EXTENT_DATA 0x6C
-#define TYPE_EXTENT_CSUM 0x80
-#define TYPE_ROOT_ITEM 0x84
-#define TYPE_ROOT_BACKREF 0x90
-#define TYPE_ROOT_REF 0x9C
-#define TYPE_EXTENT_ITEM 0xA8
-#define TYPE_METADATA_ITEM 0xA9
-#define TYPE_TREE_BLOCK_REF 0xB0
-#define TYPE_EXTENT_DATA_REF 0xB2
-#define TYPE_EXTENT_REF_V0 0xB4
-#define TYPE_SHARED_BLOCK_REF 0xB6
-#define TYPE_SHARED_DATA_REF 0xB8
-#define TYPE_BLOCK_GROUP_ITEM 0xC0
-#define TYPE_FREE_SPACE_INFO 0xC6
-#define TYPE_FREE_SPACE_EXTENT 0xC7
-#define TYPE_FREE_SPACE_BITMAP 0xC8
-#define TYPE_DEV_EXTENT 0xCC
-#define TYPE_DEV_ITEM 0xD8
-#define TYPE_CHUNK_ITEM 0xE4
-#define TYPE_TEMP_ITEM 0xF8
-#define TYPE_DEV_STATS 0xF9
-#define TYPE_SUBVOL_UUID 0xFB
-#define TYPE_SUBVOL_REC_UUID 0xFC
+enum class btrfs_key_type : uint8_t {
+ INODE_ITEM = 0x01,
+ INODE_REF = 0x0C,
+ INODE_EXTREF = 0x0D,
+ XATTR_ITEM = 0x18,
+ ORPHAN_INODE = 0x30,
+ DIR_ITEM = 0x54,
+ DIR_INDEX = 0x60,
+ EXTENT_DATA = 0x6C,
+ EXTENT_CSUM = 0x80,
+ ROOT_ITEM = 0x84,
+ ROOT_BACKREF = 0x90,
+ ROOT_REF = 0x9C,
+ EXTENT_ITEM = 0xA8,
+ METADATA_ITEM = 0xA9,
+ TREE_BLOCK_REF = 0xB0,
+ EXTENT_DATA_REF = 0xB2,
+ EXTENT_REF_V0 = 0xB4,
+ SHARED_BLOCK_REF = 0xB6,
+ SHARED_DATA_REF = 0xB8,
+ BLOCK_GROUP_ITEM = 0xC0,
+ FREE_SPACE_INFO = 0xC6,
+ FREE_SPACE_EXTENT = 0xC7,
+ FREE_SPACE_BITMAP = 0xC8,
+ DEV_EXTENT = 0xCC,
+ DEV_ITEM = 0xD8,
+ CHUNK_ITEM = 0xE4,
+ TEMP_ITEM = 0xF8,
+ DEV_STATS = 0xF9,
+ SUBVOL_UUID = 0xFB,
+ SUBVOL_REC_UUID = 0xFC
+};
#define BTRFS_ROOT_ROOT 1
#define BTRFS_ROOT_EXTENT 2
@@ -141,7 +143,7 @@
typedef struct {
uint64_t obj_id;
- uint8_t obj_type;
+ btrfs_key_type obj_type;
uint64_t offset;
} KEY;
@@ -437,8 +439,8 @@
uint32_t count;
} SHARED_DATA_REF;
-#define FREE_SPACE_EXTENT 1
-#define FREE_SPACE_BITMAP 2
+static const uint8_t FREE_SPACE_EXTENT = 1;
+static const uint8_t FREE_SPACE_BITMAP = 2;
typedef struct {
uint64_t offset;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ntfs2btrfs-20220812/src/ntfs.cpp new/ntfs2btrfs-20230501/src/ntfs.cpp
--- old/ntfs2btrfs-20220812/src/ntfs.cpp 2022-08-12 02:07:00.000000000 +0200
+++ new/ntfs2btrfs-20230501/src/ntfs.cpp 2023-05-01 22:59:36.000000000 +0200
@@ -32,7 +32,7 @@
using namespace std;
-void process_fixups(MULTI_SECTOR_HEADER* header, uint64_t length, unsigned int sector_size) {
+static void process_fixups(MULTI_SECTOR_HEADER* header, uint64_t length, unsigned int sector_size) {
uint64_t sectors;
uint16_t* seq;
uint8_t* ptr;
@@ -465,7 +465,7 @@
}
static void walk_btree(const index_root& ir, const list<mapping>& mappings, const index_node_header& inh, ntfs& dev,
- const function<void(const index_entry&, string_view)>& func, unsigned int level) {
+ const invocable<const index_entry&, string_view> auto& func, unsigned int level) {
auto ent = reinterpret_cast<const index_entry*>((uint8_t*)&inh + inh.first_entry);
do {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ntfs2btrfs-20220812/src/ntfs.h new/ntfs2btrfs-20230501/src/ntfs.h
--- old/ntfs2btrfs-20220812/src/ntfs.h 2022-08-12 02:07:00.000000000 +0200
+++ new/ntfs2btrfs-20230501/src/ntfs.h 2023-05-01 22:59:36.000000000 +0200
@@ -81,7 +81,7 @@
INDEX_ROOT = 0x90,
INDEX_ALLOCATION = 0xA0,
BITMAP = 0xB0,
- SYMBOLIC_LINK = 0xC0,
+ REPARSE_POINT = 0xC0,
EA_INFORMATION = 0xD0,
EA = 0xE0,
PROPERTY_SET = 0xF0,
@@ -135,8 +135,8 @@
case ntfs_attribute::BITMAP:
return fmt::format_to(ctx.out(), "BITMAP");
- case ntfs_attribute::SYMBOLIC_LINK:
- return fmt::format_to(ctx.out(), "SYMBOLIC_LINK");
+ case ntfs_attribute::REPARSE_POINT:
+ return fmt::format_to(ctx.out(), "REPARSE_POINT");
case ntfs_attribute::EA_INFORMATION:
return fmt::format_to(ctx.out(), "EA_INFORMATION");
@@ -551,4 +551,3 @@
void read_nonresident_mappings(const ATTRIBUTE_RECORD_HEADER& att, std::list<mapping>& mappings,
uint32_t cluster_size, uint64_t vdl);
void populate_skip_list(ntfs& dev, uint64_t inode, std::list<uint64_t>& skiplist);
-void process_fixups(MULTI_SECTOR_HEADER* header, uint64_t length, unsigned int sector_size);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ntfs2btrfs-20220812/src/ntfs2btrfs.cpp new/ntfs2btrfs-20230501/src/ntfs2btrfs.cpp
--- old/ntfs2btrfs-20220812/src/ntfs2btrfs.cpp 2022-08-12 02:07:00.000000000 +0200
+++ new/ntfs2btrfs-20230501/src/ntfs2btrfs.cpp 2023-05-01 22:59:36.000000000 +0200
@@ -451,29 +451,29 @@
last_chunk_end = chunks.back().offset - chunk_virt_offset + chunks.back().length;
}
-static void add_item(root& r, uint64_t obj_id, uint8_t obj_type, uint64_t offset, const buffer_t& buf) {
+static void add_item(root& r, uint64_t obj_id, btrfs_key_type obj_type, uint64_t offset, const buffer_t& buf) {
auto ret = r.items.emplace(KEY{obj_id, obj_type, offset}, buf);
if (!ret.second)
- throw formatted_error("Could not insert entry ({:x}, {:x}, {:x}) into root items list.", obj_id, obj_type, offset);
+ throw formatted_error("Could not insert entry ({:x}, {}, {:x}) into root items list.", obj_id, obj_type, offset);
}
-static void add_item_move(root& r, uint64_t obj_id, uint8_t obj_type, uint64_t offset, buffer_t& buf) {
+static void add_item_move(root& r, uint64_t obj_id, btrfs_key_type obj_type, uint64_t offset, buffer_t& buf) {
auto ret = r.items.emplace(KEY{obj_id, obj_type, offset}, buffer_t{});
if (!ret.second)
- throw formatted_error("Could not insert entry ({:x}, {:x}, {:x}) into root items list.", obj_id, obj_type, offset);
+ throw formatted_error("Could not insert entry ({:x}, {}, {:x}) into root items list.", obj_id, obj_type, offset);
auto& it = ret.first->second;
it.swap(buf);
}
-static void add_item(root& r, uint64_t obj_id, uint8_t obj_type, uint64_t offset, const void* data, uint16_t len) {
+static void add_item(root& r, uint64_t obj_id, btrfs_key_type obj_type, uint64_t offset, const void* data, uint16_t len) {
auto ret = r.items.emplace(KEY{obj_id, obj_type, offset}, buffer_t(len));
if (!ret.second)
- throw formatted_error("Could not insert entry ({:x}, {:x}, {:x}) into root items list.", obj_id, obj_type, offset);
+ throw formatted_error("Could not insert entry ({:x}, {}, {:x}) into root items list.", obj_id, obj_type, offset);
auto& it = ret.first->second;
@@ -500,7 +500,7 @@
ci1s.stripe.offset = c.disk_start;
ci1s.stripe.dev_uuid = dev_uuid;
- add_item(chunk_root, 0x100, TYPE_CHUNK_ITEM, c.offset, &ci1s, sizeof(ci1s));
+ add_item(chunk_root, 0x100, btrfs_key_type::CHUNK_ITEM, c.offset, &ci1s, sizeof(ci1s));
de.chunktree = BTRFS_ROOT_CHUNK;
de.objid = 0x100;
@@ -508,13 +508,13 @@
de.length = c.length;
de.chunktree_uuid = chunk_uuid;
- add_item(devtree_root, 1, TYPE_DEV_EXTENT, c.disk_start, &de, sizeof(DEV_EXTENT));
+ add_item(devtree_root, 1, btrfs_key_type::DEV_EXTENT, c.disk_start, &de, sizeof(DEV_EXTENT));
bgi.chunk_tree = 0x100;
bgi.flags = c.type;
// bgi.used gets set in update_extent_root
- add_item(extent_root, c.offset, TYPE_BLOCK_GROUP_ITEM, c.length, &bgi, sizeof(BLOCK_GROUP_ITEM));
+ add_item(extent_root, c.offset, btrfs_key_type::BLOCK_GROUP_ITEM, c.length, &bgi, sizeof(BLOCK_GROUP_ITEM));
}
static uint64_t allocate_metadata(uint64_t r, root& extent_root, uint8_t level) {
@@ -526,7 +526,7 @@
mi.extent_item.refcount = 1;
mi.extent_item.generation = 1;
mi.extent_item.flags = EXTENT_ITEM_TREE_BLOCK;
- mi.type = TYPE_TREE_BLOCK_REF;
+ mi.type = btrfs_key_type::TREE_BLOCK_REF;
mi.tbr.offset = r;
for (auto& c : chunks) {
@@ -544,7 +544,7 @@
c.used += tree_size;
- add_item(extent_root, addr, TYPE_METADATA_ITEM, level, &mi, sizeof(metadata_item));
+ add_item(extent_root, addr, btrfs_key_type::METADATA_ITEM, level, &mi, sizeof(metadata_item));
return addr;
}
@@ -594,7 +594,7 @@
c.used = tree_size;
- add_item(extent_root, addr, TYPE_METADATA_ITEM, level, &mi, sizeof(metadata_item));
+ add_item(extent_root, addr, btrfs_key_type::METADATA_ITEM, level, &mi, sizeof(metadata_item));
return addr;
}
@@ -713,21 +713,39 @@
th.tree_id = id;
th.level = 0;
+ auto get_address = [this](root& extent_root, uint8_t level) {
+ uint64_t addr;
+
+ if (!old_addresses.empty()) {
+ addr = old_addresses.front().first;
+
+ if (level != old_addresses.front().second) { // change metadata level in extent tree
+ if (auto f = extent_root.items.find(KEY{addr, btrfs_key_type::METADATA_ITEM, old_addresses.front().second}); f != extent_root.items.end()) {
+ auto d = move(f->second);
+
+ extent_root.items.erase(f);
+ extent_root.items.emplace(make_pair(KEY{addr, btrfs_key_type::METADATA_ITEM, level}, d));
+ }
+ }
+
+ old_addresses.pop_front();
+ } else {
+ addr = allocate_metadata(id, extent_root, level);
+ allocations_done = true;
+ }
+
+ addresses.emplace_back(addr, level);
+
+ return addr;
+ };
+
{
auto ln = (leaf_node*)((uint8_t*)buf.data() + sizeof(tree_header));
uint32_t data_off = tree_size - (uint32_t)sizeof(tree_header);
for (const auto& i : items) {
if (sizeof(leaf_node) + i.second.size() > space_left) { // tree complete, add to list
- if (!old_addresses.empty()) {
- th.address = old_addresses.front();
- old_addresses.pop_front();
- } else {
- th.address = allocate_metadata(id, extent_root, th.level);
- allocations_done = true;
- }
-
- addresses.push_back(th.address);
+ th.address = get_address(extent_root, 0);
th.num_items = num_items;
calc_tree_hash(th, csum_type);
@@ -769,15 +787,7 @@
}
if (num_items > 0 || items.size() == 0) { // flush remaining tree
- if (!old_addresses.empty()) {
- th.address = old_addresses.front();
- old_addresses.pop_front();
- } else {
- th.address = allocate_metadata(id, extent_root, th.level);
- allocations_done = true;
- }
-
- addresses.push_back(th.address);
+ th.address = get_address(extent_root, 0);
th.num_items = num_items;
calc_tree_hash(th, csum_type);
@@ -825,15 +835,7 @@
continue;
if (sizeof(internal_node) > space_left) { // tree complete, add to list
- if (!old_addresses.empty()) {
- th.address = old_addresses.front();
- old_addresses.pop_front();
- } else {
- th.address = allocate_metadata(id, extent_root, th.level);
- allocations_done = true;
- }
-
- addresses.push_back(th.address);
+ th.address = get_address(extent_root, level);
th.num_items = num_items;
calc_tree_hash(th, csum_type);
@@ -870,15 +872,7 @@
}
if (num_items > 0) { // flush remaining tree
- if (!old_addresses.empty()) {
- th.address = old_addresses.front();
- old_addresses.pop_front();
- } else {
- th.address = allocate_metadata(id, extent_root, th.level);
- allocations_done = true;
- }
-
- addresses.push_back(th.address);
+ th.address = get_address(extent_root, level);
th.num_items = num_items;
calc_tree_hash(th, csum_type);
@@ -894,8 +888,6 @@
} while (true);
tree_addr = ((tree_header*)trees.back().data())->address;
-
- // FIXME - make sure level of METADATA_ITEMs is correct
}
void root::write_trees(ntfs& dev) {
@@ -970,7 +962,7 @@
sys_chunk_size = 0;
for (const auto& c : chunk_root.items) {
- if (c.first.obj_type == TYPE_CHUNK_ITEM) {
+ if (c.first.obj_type == btrfs_key_type::CHUNK_ITEM) {
auto& ci = *(CHUNK_ITEM*)c.second.data();
if (ci.type & BLOCK_FLAG_SYSTEM) {
@@ -1018,7 +1010,7 @@
set_volume_label(sb, dev);
for (const auto& c : chunk_root.items) {
- if (c.first.obj_type == TYPE_DEV_ITEM) {
+ if (c.first.obj_type == btrfs_key_type::DEV_ITEM) {
memcpy(&sb.dev_item, c.second.data(), sizeof(DEV_ITEM));
break;
}
@@ -1030,7 +1022,7 @@
uint8_t* ptr = sb.sys_chunk_array;
for (const auto& c : chunk_root.items) {
- if (c.first.obj_type == TYPE_CHUNK_ITEM) {
+ if (c.first.obj_type == btrfs_key_type::CHUNK_ITEM) {
auto& ci = *(CHUNK_ITEM*)c.second.data();
if (ci.type & BLOCK_FLAG_SYSTEM) {
@@ -1097,7 +1089,7 @@
di.device_uuid = dev_uuid;
di.fs_uuid = fs_uuid;
- add_item(chunk_root, 1, TYPE_DEV_ITEM, 1, &di, sizeof(DEV_ITEM));
+ add_item(chunk_root, 1, btrfs_key_type::DEV_ITEM, 1, &di, sizeof(DEV_ITEM));
}
static void add_to_root_root(const root& r, root& root_root) {
@@ -1121,7 +1113,7 @@
// block_number, bytes_used, and root_level are set in update_root_root
- add_item(root_root, r.id, TYPE_ROOT_ITEM, 0, &ri, sizeof(ROOT_ITEM));
+ add_item(root_root, r.id, btrfs_key_type::ROOT_ITEM, 0, &ri, sizeof(ROOT_ITEM));
}
static void update_root_root(root& root_root, enum btrfs_csum_type csum_type) {
@@ -1135,7 +1127,7 @@
bool changed = true;
for (unsigned int i = 0; i < th.num_items; i++) {
- if (ln[i].key.obj_type == TYPE_ROOT_ITEM) {
+ if (ln[i].key.obj_type == btrfs_key_type::ROOT_ITEM) {
auto& ri = *(ROOT_ITEM*)((uint8_t*)t.data() + sizeof(tree_header) + ln[i].offset);
for (const auto& r : roots) {
@@ -1160,7 +1152,7 @@
memset(ds, 0, sizeof(ds));
- add_item(r, 0, TYPE_DEV_STATS, 1, &ds, sizeof(ds));
+ add_item(r, 0, btrfs_key_type::DEV_STATS, 1, &ds, sizeof(ds));
}
static BTRFS_UUID generate_uuid(default_random_engine& gen) {
@@ -1185,7 +1177,7 @@
bool changed = true;
for (unsigned int i = 0; i < th.num_items; i++) {
- if (ln[i].key.obj_type == TYPE_BLOCK_GROUP_ITEM) {
+ if (ln[i].key.obj_type == btrfs_key_type::BLOCK_GROUP_ITEM) {
auto& bgi = *(BLOCK_GROUP_ITEM*)((uint8_t*)t.data() + sizeof(tree_header) + ln[i].offset);
for (const auto& c : chunks) {
@@ -1204,8 +1196,8 @@
}
static void add_inode_ref(root& r, uint64_t inode, uint64_t parent, uint64_t index, string_view name) {
- if (r.items.count(KEY{inode, TYPE_INODE_REF, parent}) != 0) { // collision, append to the end
- auto& old = r.items.at(KEY{inode, TYPE_INODE_REF, parent});
+ if (r.items.count(KEY{inode, btrfs_key_type::INODE_REF, parent}) != 0) { // collision, append to the end
+ auto& old = r.items.at(KEY{inode, btrfs_key_type::INODE_REF, parent});
size_t irlen = offsetof(INODE_REF, name[0]) + name.length();
@@ -1229,7 +1221,7 @@
ir.n = (uint16_t)name.length();
memcpy(ir.name, name.data(), name.length());
- add_item_move(r, inode, TYPE_INODE_REF, parent, buf);
+ add_item_move(r, inode, btrfs_key_type::INODE_REF, parent, buf);
}
static void populate_fstree(root& r) {
@@ -1243,7 +1235,7 @@
ii.st_mode = __S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
ii.sequence = 1;
- add_item(r, SUBVOL_ROOT_INODE, TYPE_INODE_ITEM, 0, &ii, sizeof(INODE_ITEM));
+ add_item(r, SUBVOL_ROOT_INODE, btrfs_key_type::INODE_ITEM, 0, &ii, sizeof(INODE_ITEM));
add_inode_ref(r, SUBVOL_ROOT_INODE, SUBVOL_ROOT_INODE, 0, "..");
}
@@ -1258,7 +1250,7 @@
auto ln = (leaf_node*)((uint8_t*)t.data() + sizeof(tree_header));
for (unsigned int i = 0; i < th.num_items; i++) {
- if (ln[i].key.obj_id == 1 && ln[i].key.obj_type == TYPE_DEV_ITEM && ln[i].key.offset == 1) {
+ if (ln[i].key.obj_id == 1 && ln[i].key.obj_type == btrfs_key_type::DEV_ITEM && ln[i].key.offset == 1) {
auto& di = *(DEV_ITEM*)((uint8_t*)t.data() + sizeof(tree_header) + ln[i].offset);
di.bytes_used = 0;
@@ -1294,8 +1286,8 @@
rr.n = sizeof(subvol_name) - 1;
memcpy(rr.name, subvol_name, sizeof(subvol_name) - 1);
- add_item(root_root, BTRFS_ROOT_FSTREE, TYPE_ROOT_REF, image_subvol_id, buf);
- add_item_move(root_root, image_subvol_id, TYPE_ROOT_BACKREF, BTRFS_ROOT_FSTREE, buf);
+ add_item(root_root, BTRFS_ROOT_FSTREE, btrfs_key_type::ROOT_REF, image_subvol_id, buf);
+ add_item_move(root_root, image_subvol_id, btrfs_key_type::ROOT_BACKREF, BTRFS_ROOT_FSTREE, buf);
}
// add DIR_ITEM and DIR_INDEX
@@ -1305,7 +1297,7 @@
auto& di = *(DIR_ITEM*)buf.data();
di.key.obj_id = image_subvol_id;
- di.key.obj_type = TYPE_ROOT_ITEM;
+ di.key.obj_type = btrfs_key_type::ROOT_ITEM;
di.key.offset = 0xffffffffffffffff;
di.transid = 1;
di.m = 0;
@@ -1315,8 +1307,8 @@
auto hash = calc_crc32c(0xfffffffe, (const uint8_t*)subvol_name, sizeof(subvol_name) - 1);
- add_item(fstree_root, SUBVOL_ROOT_INODE, TYPE_DIR_ITEM, hash, buf);
- add_item_move(fstree_root, SUBVOL_ROOT_INODE, TYPE_DIR_INDEX, 2, buf);
+ add_item(fstree_root, SUBVOL_ROOT_INODE, btrfs_key_type::DIR_ITEM, hash, buf);
+ add_item_move(fstree_root, SUBVOL_ROOT_INODE, btrfs_key_type::DIR_INDEX, 2, buf);
}
// increase st_size in parent dir
@@ -1361,7 +1353,7 @@
}
}
- add_item(r, inode, TYPE_INODE_ITEM, 0, &ii, sizeof(INODE_ITEM));
+ add_item(r, inode, btrfs_key_type::INODE_ITEM, 0, &ii, sizeof(INODE_ITEM));
// add DIR_ITEM and DIR_INDEX
@@ -1370,7 +1362,7 @@
auto& di = *(DIR_ITEM*)buf.data();
di.key.obj_id = inode;
- di.key.obj_type = TYPE_INODE_ITEM;
+ di.key.obj_type = btrfs_key_type::INODE_ITEM;
di.key.offset = 0;
di.transid = 1;
di.m = 0;
@@ -1380,8 +1372,8 @@
auto hash = calc_crc32c(0xfffffffe, (const uint8_t*)image_filename, sizeof(image_filename) - 1);
- add_item(r, SUBVOL_ROOT_INODE, TYPE_DIR_ITEM, hash, buf);
- add_item_move(r, SUBVOL_ROOT_INODE, TYPE_DIR_INDEX, 2, buf);
+ add_item(r, SUBVOL_ROOT_INODE, btrfs_key_type::DIR_ITEM, hash, buf);
+ add_item_move(r, SUBVOL_ROOT_INODE, btrfs_key_type::DIR_INDEX, 2, buf);
}
// add INODE_REF
@@ -1391,7 +1383,7 @@
// increase st_size in parent dir
for (auto& it : r.items) {
- if (it.first.obj_id == SUBVOL_ROOT_INODE && it.first.obj_type == TYPE_INODE_ITEM) {
+ if (it.first.obj_id == SUBVOL_ROOT_INODE && it.first.obj_type == btrfs_key_type::INODE_ITEM) {
auto& ii2 = *(INODE_ITEM*)it.second.data();
ii2.st_size += (sizeof(image_filename) - 1) * 2;
@@ -1434,7 +1426,7 @@
ed2.offset = 0;
- add_item(r, inode, TYPE_EXTENT_DATA, addr, buf);
+ add_item(r, inode, btrfs_key_type::EXTENT_DATA, addr, buf);
data_size += ed2.size;
}
@@ -1690,7 +1682,7 @@
auto& di = *(DIR_ITEM*)buf.data();
di.key.obj_id = inode;
- di.key.obj_type = TYPE_INODE_ITEM;
+ di.key.obj_type = btrfs_key_type::INODE_ITEM;
di.key.offset = 0;
di.transid = 1;
di.m = 0;
@@ -1700,10 +1692,10 @@
auto hash = calc_crc32c(0xfffffffe, (const uint8_t*)name.data(), (uint32_t)name.length());
- if (r.items.count(KEY{dir, TYPE_DIR_ITEM, hash}) == 0)
- add_item(r, dir, TYPE_DIR_ITEM, hash, buf);
+ if (r.items.count(KEY{dir, btrfs_key_type::DIR_ITEM, hash}) == 0)
+ add_item(r, dir, btrfs_key_type::DIR_ITEM, hash, buf);
else { // hash collision
- auto& ent = r.items.at(KEY{dir, TYPE_DIR_ITEM, hash});
+ auto& ent = r.items.at(KEY{dir, btrfs_key_type::DIR_ITEM, hash});
if (!ent.empty()) {
ent.resize(ent.size() + buf.size());
@@ -1714,7 +1706,7 @@
}
}
- add_item_move(r, dir, TYPE_DIR_INDEX, seq, buf);
+ add_item_move(r, dir, btrfs_key_type::DIR_INDEX, seq, buf);
}
// add INODE_REF
@@ -1978,7 +1970,7 @@
auto& di = *(DIR_ITEM*)buf.data();
di.key.obj_id = di.key.offset = 0;
- di.key.obj_type = 0;
+ di.key.obj_type = (btrfs_key_type)0;
di.transid = 1;
di.m = (uint16_t)data.size();
di.n = (uint16_t)name.size();
@@ -1986,7 +1978,7 @@
memcpy(di.name, name.data(), name.size());
memcpy(di.name + name.size(), data.data(), data.size());
- add_item_move(r, inode, TYPE_XATTR_ITEM, hash, buf);
+ add_item_move(r, inode, btrfs_key_type::XATTR_ITEM, hash, buf);
}
static void clear_line() {
@@ -2181,6 +2173,11 @@
auto name2 = xattr_prefix + ads_name;
+ if (name2.size() > 255) {
+ add_warning("Skipping ADS :{} as name too long", ads_name);
+ break;
+ }
+
uint32_t hash = calc_crc32c(0xfffffffe, (const uint8_t*)name2.data(), (uint32_t)name2.length());
if (att.FormCode == NTFS_ATTRIBUTE_FORM::RESIDENT_FORM && (ads_name != "WofCompressedData" || !processed_wof_data)) {
@@ -2300,12 +2297,25 @@
break;
}
- case ntfs_attribute::SYMBOLIC_LINK: {
- if (att.FormCode == NTFS_ATTRIBUTE_FORM::NONRESIDENT_FORM)
- throw formatted_error("Error - SYMBOLIC_LINK is non-resident"); // FIXME - can this happen?
+ case ntfs_attribute::REPARSE_POINT: {
+ if (att.FormCode == NTFS_ATTRIBUTE_FORM::RESIDENT_FORM) {
+ reparse_point.resize(res_data.size());
+ memcpy(reparse_point.data(), res_data.data(), res_data.size());
+ } else {
+ list<mapping> rp_mappings;
+
+ read_nonresident_mappings(att, rp_mappings, cluster_size, att.Form.Nonresident.ValidDataLength);
- reparse_point.resize(res_data.size());
- memcpy(reparse_point.data(), res_data.data(), res_data.size());
+ reparse_point.resize((size_t)sector_align(att.Form.Nonresident.FileSize, cluster_size));
+ memset(reparse_point.data(), 0, reparse_point.size());
+
+ for (const auto& m : rp_mappings) {
+ dev.seek(m.lcn * cluster_size);
+ dev.read(reparse_point.data() + (m.vcn * cluster_size), (size_t)(m.length * cluster_size));
+ }
+
+ reparse_point.resize((size_t)att.Form.Nonresident.FileSize);
+ }
symlink.clear();
@@ -2607,12 +2617,37 @@
memcpy(v2.data(), v.data() + lxea.length(), v2.size());
xattrs.emplace(EA_CAP, make_pair(EA_CAP_HASH, v2));
- } else if (n != "$KERNEL.PURGE.APPXFICACHE" && n != "$KERNEL.PURGE.ESBCACHE" && n != "$CI.CATALOGHINT" &&
- n != "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.DATABASE" && n != "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.DATABASEEX1" &&
- n != "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.EPOCHEA" && n != "APPLICENSING" &&
- n != "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.COMMON" && n != "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.COMMONEX" &&
- n != "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.COMMONEX_1" && n != "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.USER") {
- add_warning("Unrecognized EA {}", ea.first);
+ } else {
+ static const string_view recognized_eas[] = {
+ "$KERNEL.PURGE.APPXFICACHE",
+ "$KERNEL.PURGE.ESBCACHE",
+ "$CI.CATALOGHINT",
+ "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.DATABASE",
+ "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.DATABASEEX1",
+ "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.EPOCHEA",
+ "APPLICENSING",
+ "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.COMMON",
+ "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.COMMONEX",
+ "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.COMMONEX_1"
+ "C8A05BC0-3FA8-49E9-8148-61EE14A67687.CSC.USER",
+ "$KERNEL.PURGE.SMARTLOCKER.VALID",
+ "$KERNEL.SMARTLOCKER.ORIGINCLAIM",
+ "$KERNEL.PURGE.APPID.HASHINFO",
+ "$KERNEL.SMARTLOCKER.HASH",
+ "$KERNEL.PURGE.CIPCACHE",
+ "$KERNEL.SMARTLOCKER.UNINSTALLSTRINGS"
+ };
+
+ bool found = false;
+ for (const auto& r : recognized_eas) {
+ if (r == n) {
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ add_warning("Unrecognized EA {}", n);
}
}
@@ -2796,7 +2831,7 @@
rph->ReparseDataLength, sizeof(wof_external_info) + sizeof(file_provider_external_info_v0));
}
- auto fpei = *(file_provider_external_info_v0*)&wofei[1];
+ const auto& fpei = *(file_provider_external_info_v0*)&wofei[1];
if (fpei.Version != FILE_PROVIDER_CURRENT_VERSION) {
throw formatted_error("rph->FILE_PROVIDER_EXTERNAL_INFO_V0 Version was {}, expected {}.",
@@ -2944,7 +2979,7 @@
ed2.address = (m.lcn * dev.boot_sector->BytesPerSector * dev.boot_sector->SectorsPerCluster) + chunk_virt_offset;
ed2.offset = 0;
- add_item(r, inode, TYPE_EXTENT_DATA, m.vcn * dev.boot_sector->BytesPerSector * dev.boot_sector->SectorsPerCluster, buf);
+ add_item(r, inode, btrfs_key_type::EXTENT_DATA, m.vcn * dev.boot_sector->BytesPerSector * dev.boot_sector->SectorsPerCluster, buf);
}
}
} else if (!inline_data.empty()) {
@@ -3050,7 +3085,7 @@
else
dev.write(compdata.data(), compdata.size());
- add_item(r, inode, TYPE_EXTENT_DATA, pos, buf);
+ add_item(r, inode, btrfs_key_type::EXTENT_DATA, pos, buf);
lcn = (ed2.address - chunk_virt_offset) / cluster_size;
cl = ed2.size / cluster_size;
@@ -3099,13 +3134,13 @@
if (vdl < inline_data.size())
memset(ed.data + vdl, 0, (size_t)(inline_data.size() - vdl));
- add_item_move(r, inode, TYPE_EXTENT_DATA, 0, buf);
+ add_item_move(r, inode, btrfs_key_type::EXTENT_DATA, 0, buf);
ii.st_blocks = inline_data.size();
}
}
- add_item(r, inode, TYPE_INODE_ITEM, 0, &ii, sizeof(INODE_ITEM));
+ add_item(r, inode, btrfs_key_type::INODE_ITEM, 0, &ii, sizeof(INODE_ITEM));
if (item_type == btrfs_inode_type::unknown) {
if (is_dir)
@@ -3207,6 +3242,16 @@
fmt::print("\n");
}
+static uint64_t get_extent_data_ref_hash2(uint64_t root, uint64_t objid, uint64_t offset) {
+ uint32_t high_crc = 0xffffffff, low_crc = 0xffffffff;
+
+ high_crc = calc_crc32c(high_crc, (uint8_t*)&root, sizeof(uint64_t));
+ low_crc = calc_crc32c(low_crc, (uint8_t*)&objid, sizeof(uint64_t));
+ low_crc = calc_crc32c(low_crc, (uint8_t*)&offset, sizeof(uint64_t));
+
+ return ((uint64_t)high_crc << 31) ^ (uint64_t)low_crc;
+}
+
static void create_data_extent_items(root& extent_root, const runs_t& runs, uint32_t cluster_size, uint64_t image_subvol_id,
uint64_t image_inode) {
for (const auto& rs : runs) {
@@ -3232,13 +3277,13 @@
di.extent_item.refcount = 1;
di.extent_item.generation = 1;
di.extent_item.flags = EXTENT_ITEM_DATA;
- di.type = TYPE_EXTENT_DATA_REF;
+ di.type = btrfs_key_type::EXTENT_DATA_REF;
di.edr.root = image_subvol_id;
di.edr.objid = image_inode;
di.edr.count = 1;
di.edr.offset = img_addr;
- add_item(extent_root, (r.offset * cluster_size) + chunk_virt_offset, TYPE_EXTENT_ITEM, r.length * cluster_size,
+ add_item(extent_root, (r.offset * cluster_size) + chunk_virt_offset, btrfs_key_type::EXTENT_ITEM, r.length * cluster_size,
&di, sizeof(data_item));
} else if (r.not_in_img) {
data_item di;
@@ -3246,32 +3291,46 @@
di.extent_item.refcount = 1;
di.extent_item.generation = 1;
di.extent_item.flags = EXTENT_ITEM_DATA;
- di.type = TYPE_EXTENT_DATA_REF;
+ di.type = btrfs_key_type::EXTENT_DATA_REF;
di.edr.root = BTRFS_ROOT_FSTREE;
di.edr.objid = r.inode;
di.edr.count = 1;
di.edr.offset = r.file_offset * cluster_size;
- add_item(extent_root, (r.offset * cluster_size) + chunk_virt_offset, TYPE_EXTENT_ITEM, r.length * cluster_size,
+ add_item(extent_root, (r.offset * cluster_size) + chunk_virt_offset, btrfs_key_type::EXTENT_ITEM, r.length * cluster_size,
&di, sizeof(data_item));
} else {
data_item2 di2;
+ EXTENT_DATA_REF* e1;
+ EXTENT_DATA_REF* e2;
di2.extent_item.refcount = 2;
di2.extent_item.generation = 1;
di2.extent_item.flags = EXTENT_ITEM_DATA;
- di2.type1 = TYPE_EXTENT_DATA_REF;
- di2.edr1.root = image_subvol_id;
- di2.edr1.objid = image_inode;
- di2.edr1.count = 1;
- di2.edr1.offset = img_addr;
- di2.type2 = TYPE_EXTENT_DATA_REF;
- di2.edr2.root = BTRFS_ROOT_FSTREE;
- di2.edr2.objid = r.inode;
- di2.edr2.count = 1;
- di2.edr2.offset = r.file_offset * cluster_size;
+ di2.type1 = btrfs_key_type::EXTENT_DATA_REF;
+ di2.type2 = btrfs_key_type::EXTENT_DATA_REF;
+
+ auto hash1 = get_extent_data_ref_hash2(image_subvol_id, image_inode, img_addr);
+ auto hash2 = get_extent_data_ref_hash2(BTRFS_ROOT_FSTREE, r.inode, r.file_offset * cluster_size);
+
+ if (hash2 > hash1) {
+ e1 = &di2.edr2;
+ e2 = &di2.edr1;
+ } else {
+ e1 = &di2.edr1;
+ e2 = &di2.edr2;
+ }
+
+ e1->root = image_subvol_id;
+ e1->objid = image_inode;
+ e1->count = 1;
+ e1->offset = img_addr;
+ e2->root = BTRFS_ROOT_FSTREE;
+ e2->objid = r.inode;
+ e2->count = 1;
+ e2->offset = r.file_offset * cluster_size;
- add_item(extent_root, (r.offset * cluster_size) + chunk_virt_offset, TYPE_EXTENT_ITEM, r.length * cluster_size,
+ add_item(extent_root, (r.offset * cluster_size) + chunk_virt_offset, btrfs_key_type::EXTENT_ITEM, r.length * cluster_size,
&di2, sizeof(data_item2));
}
}
@@ -3476,7 +3535,7 @@
}
}
- add_item(csum_root, EXTENT_CSUM_ID, TYPE_EXTENT_CSUM, (r.offset * cluster_size) + chunk_virt_offset, &csums[0], (uint16_t)(r.length * cluster_size * csum_size / sector_size));
+ add_item(csum_root, EXTENT_CSUM_ID, btrfs_key_type::EXTENT_CSUM, (r.offset * cluster_size) + chunk_virt_offset, &csums[0], (uint16_t)(r.length * cluster_size * csum_size / sector_size));
}
fmt::print("\n");
@@ -3616,7 +3675,7 @@
ii.st_nlink = 1;
ii.st_mode = __S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
- add_item(root_root, BTRFS_ROOT_TREEDIR, TYPE_INODE_ITEM, 0, &ii, sizeof(INODE_ITEM));
+ add_item(root_root, BTRFS_ROOT_TREEDIR, btrfs_key_type::INODE_ITEM, 0, &ii, sizeof(INODE_ITEM));
add_inode_ref(root_root, BTRFS_ROOT_TREEDIR, BTRFS_ROOT_TREEDIR, 0, "..");
@@ -3624,7 +3683,7 @@
auto& di = *(DIR_ITEM*)buf.data();
di.key.obj_id = BTRFS_ROOT_FSTREE;
- di.key.obj_type = TYPE_ROOT_ITEM;
+ di.key.obj_type = btrfs_key_type::ROOT_ITEM;
di.key.offset = 0xffffffffffffffff;
di.transid = 0;
di.m = 0;
@@ -3632,17 +3691,17 @@
di.type = btrfs_inode_type::directory;
memcpy(di.name, default_subvol, sizeof(default_subvol) - 1);
- add_item_move(root_root, BTRFS_ROOT_TREEDIR, TYPE_DIR_ITEM, default_hash, buf);
+ add_item_move(root_root, BTRFS_ROOT_TREEDIR, btrfs_key_type::DIR_ITEM, default_hash, buf);
}
static void add_subvol_uuid(root& r) {
- add_item(r, *(uint64_t*)&subvol_uuid, TYPE_SUBVOL_UUID, *(uint64_t*)&subvol_uuid.uuid[sizeof(uint64_t)],
+ add_item(r, *(uint64_t*)&subvol_uuid, btrfs_key_type::SUBVOL_UUID, *(uint64_t*)&subvol_uuid.uuid[sizeof(uint64_t)],
&image_subvol_id, sizeof(image_subvol_id));
}
static void update_dir_sizes(root& r) {
for (auto& it : r.items) {
- if (it.first.obj_type == TYPE_INODE_ITEM && r.dir_size.count(it.first.obj_id) != 0) {
+ if (it.first.obj_type == btrfs_key_type::INODE_ITEM && r.dir_size.count(it.first.obj_id) != 0) {
auto& ii = *(INODE_ITEM*)it.second.data();
// FIXME - would it speed things up if we removed the entry from dir_size map here?
@@ -3795,7 +3854,7 @@
for (auto& r : roots) {
if (r.id == BTRFS_ROOT_EXTENT || r.id == BTRFS_ROOT_CHUNK || r.id == BTRFS_ROOT_DEVTREE) {
- r.old_addresses = r.addresses;
+ r.old_addresses.swap(r.addresses);
r.addresses.clear();
// FIXME - unallocate metadata and changed used value in chunks
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ntfs2btrfs-20220812/src/ntfs2btrfs.h new/ntfs2btrfs-20230501/src/ntfs2btrfs.h
--- old/ntfs2btrfs-20220812/src/ntfs2btrfs.h 2022-08-12 02:07:00.000000000 +0200
+++ new/ntfs2btrfs-20230501/src/ntfs2btrfs.h 2023-05-01 22:59:36.000000000 +0200
@@ -205,7 +205,7 @@
uint64_t tree_addr;
uint8_t level;
uint64_t metadata_size = 0;
- std::list<uint64_t> addresses, old_addresses;
+ std::list<std::pair<uint64_t, uint8_t>> addresses, old_addresses;
bool allocations_done = false;
bool readonly = false;
std::map<uint64_t, uint64_t> dir_seqs;
@@ -284,21 +284,21 @@
typedef struct {
EXTENT_ITEM extent_item;
- uint8_t type;
+ btrfs_key_type type;
TREE_BLOCK_REF tbr;
} metadata_item;
typedef struct {
EXTENT_ITEM extent_item;
- uint8_t type;
+ btrfs_key_type type;
EXTENT_DATA_REF edr;
} data_item;
typedef struct {
EXTENT_ITEM extent_item;
- uint8_t type1;
+ btrfs_key_type type1;
EXTENT_DATA_REF edr1;
- uint8_t type2;
+ btrfs_key_type type2;
EXTENT_DATA_REF edr2;
} data_item2;
@@ -316,6 +316,86 @@
return ((v + s - 1) / s) * s;
}
+template<>
+struct fmt::formatter<enum btrfs_key_type> {
+ constexpr auto parse(format_parse_context& ctx) {
+ auto it = ctx.begin();
+
+ if (it != ctx.end() && *it != '}')
+ throw format_error("invalid format");
+
+ return it;
+ }
+
+ template<typename format_context>
+ auto format(enum btrfs_key_type k, format_context& ctx) const {
+ switch (k) {
+ case btrfs_key_type::INODE_ITEM:
+ return fmt::format_to(ctx.out(), "INODE_ITEM");
+ case btrfs_key_type::INODE_REF:
+ return fmt::format_to(ctx.out(), "INODE_REF");
+ case btrfs_key_type::INODE_EXTREF:
+ return fmt::format_to(ctx.out(), "INODE_EXTREF");
+ case btrfs_key_type::XATTR_ITEM:
+ return fmt::format_to(ctx.out(), "XATTR_ITEM");
+ case btrfs_key_type::ORPHAN_INODE:
+ return fmt::format_to(ctx.out(), "ORPHAN_INODE");
+ case btrfs_key_type::DIR_ITEM:
+ return fmt::format_to(ctx.out(), "DIR_ITEM");
+ case btrfs_key_type::DIR_INDEX:
+ return fmt::format_to(ctx.out(), "DIR_INDEX");
+ case btrfs_key_type::EXTENT_DATA:
+ return fmt::format_to(ctx.out(), "EXTENT_DATA");
+ case btrfs_key_type::EXTENT_CSUM:
+ return fmt::format_to(ctx.out(), "EXTENT_CSUM");
+ case btrfs_key_type::ROOT_ITEM:
+ return fmt::format_to(ctx.out(), "ROOT_ITEM");
+ case btrfs_key_type::ROOT_BACKREF:
+ return fmt::format_to(ctx.out(), "ROOT_BACKREF");
+ case btrfs_key_type::ROOT_REF:
+ return fmt::format_to(ctx.out(), "ROOT_REF");
+ case btrfs_key_type::EXTENT_ITEM:
+ return fmt::format_to(ctx.out(), "EXTENT_ITEM");
+ case btrfs_key_type::METADATA_ITEM:
+ return fmt::format_to(ctx.out(), "METADATA_ITEM");
+ case btrfs_key_type::TREE_BLOCK_REF:
+ return fmt::format_to(ctx.out(), "TREE_BLOCK_REF");
+ case btrfs_key_type::EXTENT_DATA_REF:
+ return fmt::format_to(ctx.out(), "EXTENT_DATA_REF");
+ case btrfs_key_type::EXTENT_REF_V0:
+ return fmt::format_to(ctx.out(), "EXTENT_REF_V0");
+ case btrfs_key_type::SHARED_BLOCK_REF:
+ return fmt::format_to(ctx.out(), "SHARED_BLOCK_REF");
+ case btrfs_key_type::SHARED_DATA_REF:
+ return fmt::format_to(ctx.out(), "SHARED_DATA_REF");
+ case btrfs_key_type::BLOCK_GROUP_ITEM:
+ return fmt::format_to(ctx.out(), "BLOCK_GROUP_ITEM");
+ case btrfs_key_type::FREE_SPACE_INFO:
+ return fmt::format_to(ctx.out(), "FREE_SPACE_INFO");
+ case btrfs_key_type::FREE_SPACE_EXTENT:
+ return fmt::format_to(ctx.out(), "FREE_SPACE_EXTENT");
+ case btrfs_key_type::FREE_SPACE_BITMAP:
+ return fmt::format_to(ctx.out(), "FREE_SPACE_BITMAP");
+ case btrfs_key_type::DEV_EXTENT:
+ return fmt::format_to(ctx.out(), "DEV_EXTENT");
+ case btrfs_key_type::DEV_ITEM:
+ return fmt::format_to(ctx.out(), "DEV_ITEM");
+ case btrfs_key_type::CHUNK_ITEM:
+ return fmt::format_to(ctx.out(), "CHUNK_ITEM");
+ case btrfs_key_type::TEMP_ITEM:
+ return fmt::format_to(ctx.out(), "TEMP_ITEM");
+ case btrfs_key_type::DEV_STATS:
+ return fmt::format_to(ctx.out(), "DEV_STATS");
+ case btrfs_key_type::SUBVOL_UUID:
+ return fmt::format_to(ctx.out(), "SUBVOL_UUID");
+ case btrfs_key_type::SUBVOL_REC_UUID:
+ return fmt::format_to(ctx.out(), "SUBVOL_REC_UUID");
+ default:
+ return fmt::format_to(ctx.out(), "{:x}", (uint8_t)k);
+ }
+ }
+};
+
static const uint64_t image_subvol_id = 0x100;
static const char image_filename[] = "ntfs.img";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ntfs2btrfs-20220812/src/rollback.cpp new/ntfs2btrfs-20230501/src/rollback.cpp
--- old/ntfs2btrfs-20220812/src/rollback.cpp 2022-08-12 02:07:00.000000000 +0200
+++ new/ntfs2btrfs-20230501/src/rollback.cpp 2023-05-01 22:59:36.000000000 +0200
@@ -304,7 +304,7 @@
do {
auto& key = *(KEY*)ptr;
- if (key.obj_type != TYPE_CHUNK_ITEM)
+ if (key.obj_type != btrfs_key_type::CHUNK_ITEM)
break;
auto& ci = *(CHUNK_ITEM*)(ptr + sizeof(key));
@@ -336,7 +336,7 @@
chunks_t chunks2;
walk_tree(sb.chunk_tree_addr, [&](const KEY& key, string_view data) {
- if (key.obj_type != TYPE_CHUNK_ITEM)
+ if (key.obj_type != btrfs_key_type::CHUNK_ITEM)
return true;
chunks2.emplace(key.offset, buffer_t{data.data(), data.data() + data.size()});
@@ -351,7 +351,7 @@
optional<uint64_t> ret;
walk_tree(sb.root_tree_addr, [&](const KEY& key, string_view data) {
- if (key.obj_id != root || key.obj_type != TYPE_ROOT_ITEM)
+ if (key.obj_id != root || key.obj_type != btrfs_key_type::ROOT_ITEM)
return true;
const auto& ri = *(ROOT_ITEM*)data.data();
@@ -378,17 +378,17 @@
uint32_t hash = calc_crc32c(0xfffffffe, (const uint8_t*)image_filename, sizeof(image_filename) - 1);
b.walk_tree(img_root_addr, [&](const KEY& key, string_view data) {
- if (key.obj_id > SUBVOL_ROOT_INODE || (key.obj_id == SUBVOL_ROOT_INODE && key.obj_type > TYPE_DIR_ITEM))
+ if (key.obj_id > SUBVOL_ROOT_INODE || (key.obj_id == SUBVOL_ROOT_INODE && key.obj_type > btrfs_key_type::DIR_ITEM))
return false;
- if (key.obj_id == SUBVOL_ROOT_INODE && key.obj_type == TYPE_DIR_ITEM && key.offset == hash) {
+ if (key.obj_id == SUBVOL_ROOT_INODE && key.obj_type == btrfs_key_type::DIR_ITEM && key.offset == hash) {
auto& di = *(DIR_ITEM*)data.data();
// FIXME - handle hash collisions
if (di.n == sizeof(image_filename) - 1 && !memcmp(di.name, image_filename, di.n)) {
- if (di.key.obj_type != TYPE_INODE_ITEM)
- throw formatted_error("DIR_ITEM for {} pointed to object type {:x}, expected TYPE_INODE_ITEM.",
+ if (di.key.obj_type != btrfs_key_type::INODE_ITEM)
+ throw formatted_error("DIR_ITEM for {} pointed to object type {}, expected INODE_ITEM.",
string_view(di.name, di.n), di.key.obj_type);
inode = di.key.obj_id;
@@ -408,10 +408,10 @@
map<uint64_t, pair<uint64_t, uint64_t>> extents;
b.walk_tree(img_root_addr, [&](const KEY& key, string_view data) {
- if (key.obj_id > inode || (key.obj_id == inode && key.obj_type > TYPE_EXTENT_DATA))
+ if (key.obj_id > inode || (key.obj_id == inode && key.obj_type > btrfs_key_type::EXTENT_DATA))
return false;
- if (key.obj_id != inode || key.obj_type != TYPE_EXTENT_DATA)
+ if (key.obj_id != inode || key.obj_type != btrfs_key_type::EXTENT_DATA)
return true;
const auto& ed = *(EXTENT_DATA*)data.data();
1
0